#mysql #sql #join
#mysql #sql #Присоединиться
Вопрос:
У меня есть две таблицы rooms
и rooms facilities
, и я должен выбрать комнаты с желаемыми удобствами.
Если я выберу комнату с одним объектом (объект с идентификатором = 4 — id_fu — ). используя следующий запрос, все будет в порядке:
SELECT u.* FROM rooms u
JOIN facilities_r fu
ON fu.id_uc = u.id_uc
AND fu.id_fu = '4'
WHERE 1
AND vizibility='1'
GROUP BY id_uc
ORDER BY u_premium desc, id_uc DESC
Но если я хочу выбрать комнату с большим количеством удобств, скажем, объектов с id = 4 и id = 3 .. используя следующий запрос, это не работает:
SELECT u.* FROM room u
JOIN facilities_r fu
ON fu.id_uc=u.id_uc
AND fu.id_fu = '4'
AND fu.id_fu = '3'
WHERE 1
AND vizibility = '1'
GROUP BY id_uc
ORDER BY u_premium DESC, id_uc DESC
Я не понимаю, почему это не работает, но я не могу понять, как поставить условие.
Комментарии:
1. Ни одно средство не может быть 3 и 4 одновременно. Используйте ИЛИ вместо И
Ответ №1:
Вы можете сгруппировать условия с помощью круглых скобок. Когда вы проверяете, равно ли одно поле другому, которое вы хотите использовать OR
. Например WHERE a='1' AND (b='123' OR b='234')
.
SELECT u.*
FROM rooms AS u
JOIN facilities_r AS fu
ON fu.id_uc = u.id_uc AND (fu.id_fu='4' OR fu.id_fu='3')
WHERE vizibility='1'
GROUP BY id_uc
ORDER BY u_premium desc, id_uc desc
Комментарии:
1. Что, если вы хотите убедиться, что выполнены оба условия (т. Е. Комната, в которой есть оба этих средства). Вы можете
COUNT(*)
сгруппировать строку (в этом случае вы должны убедиться, чтоCOUNT(*) = 2
. Есть ли предпочтительный способ?
Ответ №2:
SELECT
u . *
FROM
room u
JOIN
facilities_r fu ON fu.id_uc = u.id_uc
AND (fu.id_fu = '4' OR fu.id_fu = '3')
WHERE
1 and vizibility = '1'
GROUP BY id_uc
ORDER BY u_premium desc , id_uc desc
Здесь вы должны использовать ИЛИ, а не И.
Поскольку id_fu не может быть равен 4 и 3 одновременно.
Комментарии:
1. Да, это работает с or, но это неверно… Строки из facilities_r являются id_f_unit id_uc id_fu 18 4 4 17 4 3, поэтому мне нужно их выбрать…
2. Хорошо, в этом случае также следует использовать только OR. Чтобы выбрать записи, которые имеют x = 5,6,7, вы должны написать x = 5 ИЛИ x = 6 ИЛИ x = 7
3. Спасибо за помощь… Я попробовал использовать подзапросы wit, и, похоже, это работает выберите u.* из комнат u ПРИСОЕДИНИТЕ facilities_r fu к fu.id_uc= u.id_uc и 4 в (ВЫБЕРИТЕ id_fu из facilities_r fu, где fu.id_uc=u.id_uc) и 3 в (ВЫБЕРИТЕ id_fu из facilities_r fu, где fu.id_uc=u.id_uc), где 1 и vizibilitate = ‘1’ группируют по id_uc порядок по u_premium desc, id_uc desc но выполнение этого, вероятно, займет больше времени, чем первого… но это работает 🙂
Ответ №3:
Если вы дважды присоединитесь к таблице объектов, вы получите то, что вам нужно:
select u.*
from room u
JOIN facilities_r fu1 on fu1.id_uc = u.id_uc and fu1.id_fu = '4'
JOIN facilities_r fu2 on fu2.id_uc = u.id_uc and fu2.id_fu = '3'
where 1 and vizibility='1'
group by id_uc
order by u_premium desc, id_uc desc
Ответ №4:
также это должно работать (не тестировалось):
SELECT u.*
FROM room u
JOIN facilities_r fu ON fu.id_uc = u.id_uc AND u.id_fu IN(4,3)
WHERE 1 AND vizibility = 1
GROUP BY id_uc
ORDER BY u_premium desc , id_uc desc
Если u.id_fu
это числовое поле, то вы можете удалить '
вокруг них.
То же самое для vizibility
. Только если поле является текстовым полем (тип данных char, varchar или один из текстовых типов данных, например, longtext), тогда значение должно быть заключено в '
или четное "
.
Также я и Oracle также рекомендуем заключать имена таблиц и полей в обратные ссылки. Таким образом, у вас не возникнет проблем, если имя поля содержит ключевое слово.