匹配多个AND时如何获取行?

时间:2014-04-02 08:42:19

标签: sql

我有一点问题,我有一张这样的表:

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.但事实并非如此。

我做错了什么? :(

3 个答案:

答案 0 :(得分:1)

这不起作用,因为没有行可以匹配该条件。相反,请使用group byhaving

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子句中的一系列可能性中的匹配项。