Запрос из трех таблиц - помогите исправить

WMix

герр M:)ller
Партнер клуба
PHP:
SELECT *
FROM `htl_periodes` p
LEFT JOIN `htl_costs` c       ON c.htl_periode_id = p.htl_periode_id
LEFT JOIN `htl_cost_type` ct  ON c.htl_cost_type_id = ct.htl_cost_type_id
LEFT JOIN `htl_room_types` rt ON c.htl_room_type_id = rt.htl_room_type_id
WHERE p.htl_id = $id
 

Эдди

Новичок
PHP:
SELECT *
FROM `htl_periodes` p
LEFT JOIN `htl_costs` c       ON c.htl_periode_id = p.htl_periode_id
LEFT JOIN `htl_cost_type` ct  ON c.htl_cost_type_id = ct.htl_cost_type_id
LEFT JOIN `htl_room_types` rt ON c.htl_room_type_id = rt.htl_room_type_id
WHERE p.htl_id = $id
Даже боюсь пробовать.
Но если будет ОК, проси хошь пива, хошь водки.

Потому что иначе мне непосредственно БД править приходилось, чтобы вывести то, что надо. А это не айс, я бы сказал.
 

Эдди

Новичок
- Почему админы такие худые, а программеры такие толстые.
- Да потому что админы бегают, а программеры сидят и "пьют пиво". :)
Я не шучу.
Моя загруженность работой напрямую с базой данных в применении к каждому отелю, а их десятки и даже тысячи, напрягает. Не дает заниматься своей работой.

А потом еще мне предстоит jquery делать добавление и удаление строк из таблицы, скриншот которой выложил. Тоже тот еще гимор. Вот это будет реальный п*здец!

Как сказал, к вечеру после работы устал. Встаю в 3 утра. Тогда и проверю, как и что.
 
Последнее редактирование:

Эдди

Новичок
Еще вопрос, Мюллер. Почему ты не используешь USING? У меня все первичные ключи во всех таблицах совпадают.
 

Эдди

Новичок
PHP:
SELECT *
FROM `htl_periodes` p
LEFT JOIN `htl_costs` c       ON c.htl_periode_id = p.htl_periode_id
LEFT JOIN `htl_cost_type` ct  ON c.htl_cost_type_id = ct.htl_cost_type_id
LEFT JOIN `htl_room_types` rt ON c.htl_room_type_id = rt.htl_room_type_id
WHERE p.htl_id = $id
Наконец добрался до этого запроса.
Вот смотри. Он выводит только те типы размещения, которые уже введены для конкретного отеля.
А форма моя должна выводить ВСЕ типы размещения, включая те, которые уже введены. Чтобы иметь возможность добавить еще один тип в чекбоксе.
То есть не
Код:
htl_costs LEFT JOIN htl_cost_types
А наоборот
Код:
htl_cost_types LEFT JOIN htl_costs
В общем, задолбал я вас всех этим запросом.
Возможно, надо искать другие пути.
А хотелось не плодить дополнительные запросы и создавать дополнительные формы, использовать аякс и пр.
полудух Ну так посоветуй, какие формы использовать в этом конкретном случае...
 

полудух

Итсист
А хотелось не плодить дополнительные запросы и создавать дополнительные формы, использовать аякс и пр.
должна быть очень-очень веская причина, чтобы отказываться от НФ
а аякс тут причём


полудух Ну так посоветуй, какие формы использовать в этом конкретном случае...
начни с 1НФ, а там смотри уже, может и 2 или 3 получится
 

Эдди

Новичок
полудух. Аякс тоже может пригодиться. Пока другими скриптами занимаюсь.
В общем, "пересплю" еще одну ночь с проблемой. А там решу.
Если интересно, выложу результат.
 

WMix

герр M:)ller
Партнер клуба
htl_costs LEFT JOIN htl_cost_types или htl_cost_types LEFT JOIN htl_costs в твоем случае роли не играет.
запрос действительно выводит только то что есть в базе и ничего сам не генерит. подумай на досуге об этом и поставь правильно вопрос

@полудух, причем тут нормальная форма?
 

полудух

Итсист
@полудух, причем тут нормальная форма?
она всегда причём, когда разные объекты нужно скрещивать
а здесь у нас: отели, типы размещения (основные + дополнительные), цены
+ какие-то htl_periodes...
в обязательном порядке потом ещё и клиенты вылезут
и пока ТС будет пытаться скрестить всё это в одной таблице, у него всегда будут проблемы.
 

WMix

герр M:)ller
Партнер клуба
ну, "отели, типы размещения (основные + дополнительные), цены + какие-то htl_periodes..."
все же раздельно и записи в одном экземпляре. причем тут нф? или конкретно скажи где ошибка.
 

полудух

Итсист
все же раздельно и записи в одном экземпляре. причем тут нф?

Вот таблицы:
htl_periodes //Периоды. В этой и только в этой таблице есть id самого отеля, который нужно выбрать
htl_periode_id
htl_periode
htl_id

htl_costs //Цены
htl_cost_id
htl_periode_id
htl_cost_type_id
htl_room_type_id
htl_cost

htl_cost_types //Основные типы размещения в отелях
htl_cost_type_id
htl_cost_type

htl_room_types //Дополнительные типы размещения в отелях
htl_room_type_id
htl_room_type
конкретно вот это:
htl_costs //Цены
htl_cost_id
htl_periode_id
htl_cost_type_id
htl_room_type_id
htl_cost

что, собственно, и происходит, судя по стонам ТС

"раздельно", это вот так:
hotels:
htl_id,htl_desc

room_type (типы размещений):
room_id,room_desc

далее стоимость (cost)... вот эта картинка причиняет боль:


почему SUITE и JSUITE это одновременно и cost_type, и room_type ?
непонятно.
ну да пофиг, пусть это будет 2 таблицы:
dop_uslugi1:
id,desc

и dop_uslugi2:
id,desc

кто такие htl_periodes не совсем понял, но походу нахуй не нужно:
В таблице htl_periodes и только в ней одной содержатся htl_id конкретных отелей, из которых надо выбрать один.
Если бы не это, то таблица эта вообще не нужна была бы.
если у тебя там периоды заселения со скидками, типа: 1 мес = 5%, 2 = 10%, то да, это отдельная таблица, только без htl_id
а иначе вообще непонятно, что это?

Короче, после упорядочивания этого бардака, мы получим действительно раздельные таблицы, которые потом можно скрещивать, как угодно, через Нормальные Формы. И тогда такая задача:
Чтобы выбирались все основные типы размещение из таблицы htl_cost_types.
Если при этом есть в таблице htl_costs есть записи, где одному основному типу размещения соответствуют один или несколько дополнительных типов размещения, чтобы основной тип размещения выводился столько раз, сколько есть комбинация основных и дополнительных типов размещения.
...становится тривиальной...
Потому что есть таблица по Первой Нормальной Форме:
dop1_dop2:
dop1_id,dop2_id
1,5
1,7
1,8
2,3
3,6
3,8
3,12
6,7
6,9
6,10
(только вот зачем привязывать услуги друг к другу, когда они должны быть привязаны к клиенту, например, или к комнате какой-то?)

в общем дальше делаются такие же формы-таблицы с htl_id, клиентами, ценами, комнатами.
или, если данные позволяют, можно попробовать расширить до 2НФ, 3НФ, где будет как-то так:
room_id,dop1_id,dop2_id
1,1,5
1,1,7
15,1,8

в общем суть понятна.
задача, само по себе, с лёгким налётом запутанности и далека от кристального понимания, поэтому ну её нахуй.
 
Последнее редактирование:

WMix

герр M:)ller
Партнер клуба
конкретно вот это:
htl_costs //Цены
htl_cost_id
htl_periode_id
htl_cost_type_id
htl_room_type_id
htl_cost
я так читаю,
в периуд летних каникул, цена в апартментах, за одно место в духместном номере составляет ххх
далее стоимость (cost)... вот эта картинка причиняет боль:
а тут мы видим денормализированный ответ результат join'а
а дальше чтото тебя совсем пронесло.
 

Эдди

Новичок
полудух. Объясняю.
Основной тип размещения может вообще не иметь дополнительного.
То есть, просто Дабл и в поле htl_room_type_id будет 0.
И тут же может быть Дабл, где htl_room_type_id будет соответствовать С балконом, или с кроватью Кинг Сайз.

А теперь скажите, на сколько процентов будет криво сделать так, чтобы получить то, что мне нужно:
Делаю:
Код:
SELECT * FROM `htl_cost_types` ORDER BY `sort`
То есть получаю полный массив значений основного типа размещения с сортировкой.

Далее запрос, получающий уже сохраненные цены по конкретному отелю:
Код:
SELECT *
FROM `htl_periodes` p
LEFT JOIN `htl_costs` c      ON c.htl_periode_id = p.htl_periode_id
LEFT JOIN `htl_cost_type` ct  ON c.htl_cost_type_id = ct.htl_cost_type_id
LEFT JOIN `htl_room_types` rt ON c.htl_room_type_id = rt.htl_room_type_id
WHERE p.htl_id = $id
Тоже - массив.

Объединяю два массива, удаляю дубликаты, если вдруг они будут, сортирую и вывожу в мою форму.

:) (камни не кидать, ведь главное получить то, что надо)
 

WMix

герр M:)ller
Партнер клуба
Код:
SELECT DISTINCT *
FROM `htl_periodes` p, `htl_cost_type` ct
LEFT JOIN `htl_costs` c ON c.htl_periode_id = p.htl_periode_id
LEFT JOIN `htl_room_types` rt ON c.htl_room_type_id = rt.htl_room_type_id
WHERE p.htl_id = $id
ORDER BY ct.`sort`
 

полудух

Итсист
полудух. Объясняю.
да хреновый из тебя объяснятель.
ты вообще читаешь, что тебе пишут или так и будешь дальше делать "как ты думаешь будет правильно" ?
если хочешь получить решение, то:
1. разбиваешь все данные по отдельным таблицам;
2. выкладываешь сюда примеры всех этих таблиц;
3. руками рисуешь таблицу с желаемым результатом и показываешь уже наконец внятно - ЧТО ты хочешь получить.
 
Последнее редактирование:
Сверху