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

Эдди

Новичок
Все. Не могу. Думаю, да все не туда.

Есть 3 таблицы:

htl_periodes
htl_periode_id
htl_periode
htl_id

htl_costs
htl_cost_id
htl_periode_id
htl_cost_type_id
htl_cost

htl_cost_types
htl_cost_type_id
htl_cost_type

Из таблицы htl_cost_types надо вывести ВСЕ ЗАПИСИ.
Из таблицы htl_costs ТОЛЬКО ТЕ ЗАПИСИ, которые в связке с таблицей htl_periodes соответствуют htl_id=определенному значению.

Вот этот запрос выводит то, что надо, но не выводит ВСЕ ЗАПИСИ из таблицы htl_cost_types.
Хелп, плиз... ... ...
Код:
SELECT DISTINCT
        htl_cost_types.htl_cost_type_id,
        htl_cost_type
      FROM
        `htl_cost_types`
      LEFT JOIN
        `htl_costs`
      ON
        htl_cost_types.htl_cost_type_id=htl_costs.htl_cost_type_id
      LEFT JOIN
        `htl_periodes`
      ON
        htl_costs.htl_periode_id=htl_periodes.htl_periode_id
      WHERE
        `htl_id`=2084
Знаю, что последний LEFT JOIN не на месте и неправильный.
А как было бы правильно?
 
Последнее редактирование:

AnrDaemon

Продвинутый новичок
Все записи или id всех записей?
У тебя постановка задачи не стыкуется с решением.
 

Эдди

Новичок
Из третьей таблицы надо вывести все записи, не только id (оба столбца).

Поясняю, что это и для чего.

В таблице htl_periodes и только в ней одной содержатся htl_id конкретных отелей, из которых надо выбрать один.
Если бы не это, то таблица эта вообще не нужна была бы.

Надо вывести все существующие в природе типы размещения (таблица htl_cost_types).
Их htl_cost_type_id и их описание - htl_cost_type.

При этом пометив, цены на какие типы размещения у конкретного отеля уже есть (в чекбоксах).
А содержатся они в таблице htl_costs.

Таблица htl_cost_types связана с таблицейhtl_costs и через нее с таблицей htl_periodes.
 

AnrDaemon

Продвинутый новичок
Ещё раз. Смотрите на свой звпрос.
Вы запрашиваете ТОЛЬКО htl_cost_types.htl_cost_type_id. Одно поле. Ничего больше.
Вы вообще читаете сами то, что сами же пишете?
Или надеетесь, что мы вам за вас это всё читать будем?
Может ещё по ролям, вслух и с выражением?

Напишите свой запрос на русском языке. Потом переведите на SQL.
 

Эдди

Новичок
ВЫБРАТЬ все типы размещения (как id, так и htl_cost_type) из таблицы типов размещения (htl_cost_types).
Выбрать только те цены (достаточно одного id) из таблицы стоимости каждого типа размещения (htl_costs),
но только в том случае, когда эти цены присутствуют у отеля, выбранного в таблице периодов (htl_periodes), в которой htl_id равен выбранному конкретному отелю.

Так что ли? :)

В данном случае все записи типов размещения не выводятся, а только те, которые есть у конкретного отеля. Поэтому и прошу помочь исправить запрос.

Код:
SELECT DISTINCT
        htl_cost_types.htl_cost_type_id,
        htl_cost_type
      FROM
        `htl_cost_types`
      LEFT JOIN
        `htl_costs`
      ON
        htl_cost_types.htl_cost_type_id=htl_costs.htl_cost_type_id
      LEFT JOIN
        `htl_periodes`
      ON
        htl_costs.htl_periode_id=htl_periodes.htl_periode_id
      WHERE
        `htl_id`=2084
 

AnrDaemon

Продвинутый новичок
Вы неправильно понимаете SQL >.<
Вы выбираете не записи (строки), вы выбираете столбцы!
А строк у вас получается столько, сколько получается.

Вот и выбирайте id, смешивайте их с отелями, а потом узнавайте, где там у вас цены.
А если вас вообще интересуют цены, а не отели, то от цен и надо плясать!
 

Эдди

Новичок
Люди, ну помогите же в конце концов. :) Замучался уже.
Все написанное выше вычеркиваю. Дело чуть усложнилось. Добавилась четвертая таблица.
Но не в ней дело.
Вот таблицы:
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

Вот этот запрос работает. Но в него надо добавить id конкретного отеля, который имеется только в первой таблице htl_periodes.
Код:
SELECT DISTINCT
        htl_cost_types.htl_cost_type_id,
        `htl_cost_type`,
        htl_room_types.htl_room_type_id,
        `htl_room_type`
      FROM
        `htl_cost_types`
      LEFT JOIN
        `htl_costs`
      ON
        htl_cost_types.htl_cost_type_id=htl_costs.htl_cost_type_id
      LEFT JOIN
        `htl_room_types`
      ON
        htl_costs.htl_room_type_id=htl_room_types.htl_room_type_id
      ORDER BY
        htl_cost_types.sort ASC,
        htl_room_types.sort ASC
Вот только он выводит все возможные основные и дополнительные типы размещения во всех отелях.
Как сюда присобачить таблицу htl_periodes, чтобы в WHERE можно было бы выбрать отель по его id,
поскольку id имеется только в этой таблице.
Уже голову всю сломал...
 

AnrDaemon

Продвинутый новичок
Как надо, так и "присобачивайте".
Вы так и не сказали, что именно вам нужно в итоге получить? Список комнат с заданнными способами оплаты?
 

Эдди

Новичок
Как надо, так и "присобачивайте".
Вы так и не сказали, что именно вам нужно в итоге получить? Список комнат с заданнными способами оплаты?
Цены не нужны.
Нужны все основные и дополнительные типы размещения с информацией на то, сохранены ли для них цены у конкретного отеля.
Вышеуказанным запросом я все получаю, кроме выборки по конкретному отелю, а по всем отелям. А мне нужно дополнить запрос таблицей htl_periodes и сделать htl_id=(какой-то id).
Вот что выводит запрос, который выше.
 
Последнее редактирование:

Эдди

Новичок
Добавить в этот запрос таблицу htl_periodes:
Код:
SELECT DISTINCT
        htl_cost_types.htl_cost_type_id,
        `htl_cost_type`,
        htl_room_types.htl_room_type_id,
        `htl_room_type`
      FROM
        `htl_cost_types`
      LEFT JOIN
        `htl_costs`
      ON
        htl_cost_types.htl_cost_type_id=htl_costs.htl_cost_type_id
      LEFT JOIN
        `htl_room_types`
      ON
        htl_costs.htl_room_type_id=htl_room_types.htl_room_type_id
      ORDER BY
        htl_cost_types.sort ASC,
        htl_room_types.sort ASC
чтобы структура осталась как есть, но чтобы отсечь записи, которые не относятся к конкретному отелю, потому что здесь выведены записи по всем отелям.
А id отеля есть только в таблице периодов htl_periode_id, связанной с таблицей цен htl_costs,
связанной в таблицами основного и доп. типов размещения htl_cost_types и htl_room_types.
 

WMix

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

Эдди

Новичок
добавить еще одну таблицу пожно по разному, понять бы что ты хочешь..
а что значит "не нарушив запрос", что в твоем понимании "запрос"?
Чтобы выбирались все основные типы размещение из таблицы htl_cost_types.
Если при этом есть в таблице htl_costs есть записи, где одному основному типу размещения соответствуют один или несколько дополнительных типов размещения, чтобы основной тип размещения выводился столько раз, сколько есть комбинация основных и дополнительных типов размещения.
Вот для этой формы:
 

WMix

герр M:)ller
Партнер клуба
Чтобы выбирались все основные типы размещение из таблицы htl_cost_types.
Если при этом есть в таблице htl_costs есть записи, где одному основному типу размещения соответствуют один или несколько дополнительных типов размещения, чтобы основной тип размещения выводился столько раз, сколько есть комбинация основных и дополнительных типов размещения
 

Эдди

Новичок
Был бы благодарен за определение П**деца. :)
Только не "из википедии", а в данном конкретном случае. :D
 

WMix

герр M:)ller
Партнер клуба
както ты многословно думаешь, ну очень запутано и сложно
мне даже казалось что это сгенеренная база данных, но послушав твое обьяснение того что ты хочешь,... мне стало тебя жалко, капец как сложно ))

ну да не суть. грубо я понимаю, что все таблички правильно сложить, так
PHP:
SELECT *
FROM `htl_costs` c
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
 
Последнее редактирование:

Эдди

Новичок
Ув. Герр!
Давай добьем этот запрос, если это вообще реально сделать.
Иначе вместо одного запроса я накосячу около тысячи, что не есть хорошо.

Да, твой запрос лаконичнее и проще. А если еще вместо ON использовать USING, то еще лаконичнее станет.
Но выводит он абсолютно то же самое, что и мой вышеуказанный.

Исправленный запрос должен (повторяюсь в сотый раз):
Вывести все записи из таблицы htl_cost_types.
Плюс к тому дополнительно вывести все записи основных типов из таблицы htl_cost_types, если в ценах (таблица htl_costs) наличествует хоть какой-то дополнительный тип (left join htl_room_types).
И сделать это только применительно к конкретному отелю, id которого находится в таблице htl_periodes, связанной с таблицей htl_costs по htl_periode_id.

Сможем? Или лимон запросов делать?
 

Эдди

Новичок
Мне нужно понять, это реально? Или "думать в другом направлении" с множеством запросов?
 
Сверху