遇到需要满足多个条件的 MySQL Join 问题
Posted
技术标签:
【中文标题】遇到需要满足多个条件的 MySQL Join 问题【英文标题】:Having issues with a MySQL Join that needs to meet multiple conditions 【发布时间】:2011-12-22 13:03:33 【问题描述】:我有两张桌子rooms
和rooms 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 问题的主要内容,如果未能解决你的问题,请参考以下文章