У меня две таблицы. Мне нужно выбрать все строки (только одно условие hotel_id = 2) из первой таблицы и выбранных строк (на основе условия) из 2-й таблицы. Но я использую левое соединение, чтобы получить только данные из второй таблицы.
запрос
SELECT R.name room_name,
R.id room_id,
UD.discount
FROM user_discounts UD
LEFT
JOIN rooms R
ON R.id = UD.room_id
WHERE UD.user_id = 1482
AND UD.hotel_id = 2
Мне нужно показать все комнаты, но теперь показывает общее в двух таблицах.
Обратные связи между таблицами, если вы хотите, чтобы все номера
SELECT 'R'.'name' as 'room_name', 'R'.'id' as 'room_id', 'UD'.'discount' as 'discount'
FROM 'rooms' as 'R'
LEFT JOIN 'user_discounts' as 'UD' ON 'R'.'id'= 'UD'.'room_id'
AND'UD'.'user_id' = '1482'
AND 'UD'.'hotel_id' = '2'
Но вам также нужно будет изменить предложение where. Вместо исходного предложения where они могут использоваться как часть условий соединения.
Эффект предложения where может быть легко упущен, но если вы ссылаетесь на левую объединенную таблицу в предложении where, вы также должны указывать, что данные из этой таблицы равны NULL. например
SELECT 'R'.'name' as 'room_name', 'R'.'id' as 'room_id', 'UD'.'discount' as 'discount'
FROM 'rooms' as 'R'
LEFT JOIN 'user_discounts' as 'UD' ON 'R'.'id'= 'UD'.'room_id'
WHERE ('UD'.'user_id' = '1482'
AND 'UD'.'hotel_id' = '2'
)
OR 'UD'.'room_id' IS NULL
Если в столовых есть hotel_id, то:
SELECT 'R'.'name' as 'room_name', 'R'.'id' as 'room_id', 'UD'.'discount' as 'discount'
FROM 'rooms' as 'R'
LEFT JOIN 'user_discounts' as 'UD' ON 'R'.'id'= 'UD'.'room_id'
AND'UD'.'user_id' = '1482'
AND 'UD'.'hotel_id' = 'R'.'hotel_id'
WHERE 'R'.'hotel_id' = 2
Насколько я понимаю, вам нужны все данные из первой таблицы и только из второй таблицы, которая соответствует вашим критериям.
SELECT 'R'.'name' as 'room_name', 'R'.'id' as 'room_id', 'UD'.'discount' as 'discount'
FROM 'rooms' as 'R'
LEFT JOIN 'user_discounts' as 'UD' ON 'R'.'id'= 'UD'.'room_id'
AND 'UD'.'user_id' = '1482'
AND 'UD'.'hotel_id' = '2'
В соответствии с вашим запросом, where
часть поворачивается налево, присоединяется к внутреннему соединению, поэтому вы не получите все строки из первой таблицы. Чтобы решить эту проблему, переместите фильтры для второй таблицы в on
, поэтому только те записи, которые соответствуют критериям, будут вернулся со второй таблицы
rooms
есть столбец hotel_id
если это так, добавьте where r.hotel_id = 2
если вы используете ud.hotel_id
тогда вы снова получите только номера, которые соответствуют этим критериям