遇到需要满足多个条件的 MySQL Join 问题

Posted

技术标签:

【中文标题】遇到需要满足多个条件的 MySQL Join 问题【英文标题】:Having issues with a MySQL Join that needs to meet multiple conditions 【发布时间】:2011-12-22 13:03:33 【问题描述】:

我有两张桌子roomsrooms facilities,我必须选择配备所需设施的房间。

如果我选择一个有一个设施的房间(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 

我不明白为什么它不起作用,但我无法弄清楚如何放置条件。

【问题讨论】:

没有设施可以同时是 3 和 4。使用 OR 代替 AND 【参考方案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

【讨论】:

如果您想确保满足这两个条件怎么办(即:具有这两种设施的房间)。您可以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

您必须在这里使用 OR,而不是 AND。

因为 id_fu 不能同时等于 4 和 3。

【讨论】:

是的,它可以使用,或者但它不正确...来自 facility_r 的行是 id_f_unit id_uc id_fu 18 4 4 17 4 3 所以我需要选择它们... 很好,在这种情况下,您也应该只使用 OR。要选择 x=5,6,7 的记录,您必须编写 x=5 OR x=6 OR x=7 感谢您的帮助...我尝试了机智子查询,它似乎工作 select u.* from rooms u JOIN facility_r fu on fu.id_uc=u.id_uc 和 4 in (SELECT id_fu from facility_r fu where fu.id_uc=u.id_uc) and 3 in (SELECT id_fu from facility_r fu where fu.id_uc=u.id_uc) where 1 and vizibilitate='1' group by id_uc order by 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 是一个数字字段,那么您可以删除它们周围的 '。 可见性也是如此。仅当字段是文本字段(数据类型 char、varchar 或文本数据类型之一,例如 longtext)时,该值必须用 ' 甚至 " 括起来。

另外,我和 Oracle 也建议将表名和字段名包含在反引号中。 因此,如果字段名称包含关键字,您将不会遇到麻烦。

【讨论】:

以上是关于遇到需要满足多个条件的 MySQL Join 问题的主要内容,如果未能解决你的问题,请参考以下文章

SQL Join 一对多从满足条件的相同键值组中提取值

Mysql Join

MySQL LEFT JOIN 多个条件

MySQL之-查询操作常常遇到的坑

mysql关联left join条件on和where条件的区别及结合coalesce函数

最全解释Mysql 的join中on与where 过滤条件差异