我有一点问题,我有一张这样的表:
CREATE TABLE IF NOT EXISTS `t_ot_prestation` (
`id_ot` int(11) NOT NULL,
`id_prestation` int(11) NOT NULL,
PRIMARY KEY (`id_ot`,`id_prestation`)
) ENGINE=MyISAM;
我想得到的是根据多个id_prestation得到不同的id_ot。例如,我期待:
SELECT id_ot
FROM `t_ot_prestation`
WHERE `id_prestation` =723
AND `id_prestation` =1177;
给我所有id_ot有2行723和1177.但事实并非如此。
我做错了什么? :(
答案 0 :(得分:1)
这不起作用,因为没有行可以匹配该条件。相反,请使用group by
和having
:
SELECT id_ot
FROM `t_ot_prestation`
GROUP BY id_ot
HAVING sum(case when `id_prestation` = 723 then 1 else 0 end) > 0 and
sum(case when `id_prestation` = 1177 then 1 else 0 end) > 0;
having
子句中的每个条件都计算每个值的匹配数。 > 0
只是说至少有一行与特定值匹配。
答案 1 :(得分:0)
每条记录都会查看WHERE子句。当然,没有单个记录同时包含id_prestation = 723和id_prestation = 1177。
以下是解决此问题的一种方法(前提是您的dbms支持INTERSECT):
SELECT id_ot
FROM `t_ot_prestation`
WHERE `id_prestation` =723
INTERSECT
SELECT id_ot
FROM `t_ot_prestation`
WHERE `id_prestation` =1177;
我想到的其他方式有:EXISTS子句,IN子句,自连接,分组依据。
答案 2 :(得分:0)
正如其他人所确认的那样,没有符合这两个条件的行,这是另一种方法:
SELECT id_ot
FROM `t_ot_prestation`
WHERE `id_prestation` IN (723, 1177)
您正在寻找IN
子句中的一系列可能性中的匹配项。