MySQL连接存在需要满足多种条件的问题

MySQL连接存在需要满足多种条件的问题,mysql,sql,join,Mysql,Sql,Join,我有两个桌子房间和房间设施,我必须选择具有所需设施的房间 如果我选择一个房间,其中有一个id=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 DES

我有两个桌子房间和房间设施,我必须选择具有所需设施的房间

如果我选择一个房间,其中有一个id=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 
我不明白为什么它不起作用,但我想不出如何设置这个条件

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。

您可以用括号将条件分组。当您检查一个字段是否等于另一个字段时,您希望使用或。例如,其中a='1'和b='123'或b='234'


如果您两次加入设施表,您将获得您想要的:

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

此外,这也应适用于未经测试的情况:

从房间u中选择u.*在4,3中的fu.id\u uc=u.id\u uc和u.id\u fu上加入设施,其中1和vizibility=1按id分组,按u\u高级描述,id\u uc描述

如果u.id_-fu是一个数字字段,则可以删除其周围的'。 可视性也是如此。仅当字段为文本字段数据类型char、varchar或文本数据类型之一(如longtext)时,该值必须用“或偶数”括起

此外,我和Oracle也建议将表名和字段名用反勾号括起来。
因此,如果字段名包含关键字,您就不会遇到麻烦。

是的,它与或一起工作,但不正确。。。设施的线路是id\u f\u unit id\u uc id\u fu 18 4 4 17 4 3,因此我需要选择它们…好的,在这种情况下,您也应该使用或仅使用。要选择x=5,6,7的记录,你必须写x=5或x=6或x=7谢谢你的帮助…我尝试了子查询,它似乎可以从房间中选择你*加入fu.id\u uc=u.id\u uc,从fu.id\u uc=u.id\u uc中选择id\u fu,从fu.id\u uc=u.id\u uc中选择id\u fu,从fu中选择3vizibilitate='1'group by id_uc order by u_premium desc,id_uc desc,但这可能需要比第一个更长的时间来执行…但它是有效的:没有设施可以同时为3和4。使用或代替,如果你想确保两个条件都满足,那该怎么办?即:一个同时具备这两个设施的房间。您可以对分组行进行计数*。在这种情况下,您可以确保计数*=2。有更好的方法吗?
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