Проблемы с соединением MySQL, которое должно соответствовать нескольким условиям

#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 также рекомендуем заключать имена таблиц и полей в обратные ссылки. Таким образом, у вас не возникнет проблем, если имя поля содержит ключевое слово.