需要通过对两个表的半复杂查询进行帮助思考

时间:2013-09-24 18:15:25

标签: mysql sql select

我有两个表,我想根据另一个表中的多个记录创建一个SELECT从一个表中提取单个记录。

如果我举一个例子,也许会更清楚。

表:日期。字段:dosID,personID,name,dateIn

1 | 10 | john smith | 2013-09-05
2 | 10 | john smith | 2013-01-25

表:卡片。字段:cardID,personID,cardColor,cardDate

1 | 10 | red    | 2013-09-05
2 | 10 | orange | 2013-09-05
3 | 10 | black  | 2013-09-05
4 | 10 | green  | 2013-01-25
5 | 10 | orange | 2013-01-25

所以我想要的是,如果一个人没有收到“红色”卡,只能从日期表中选择一条记录。我最接近的是:

SELECT name, dateIn FROM dates, cards 
WHERE dates.personID = cards.personID AND cardColor != 'red' AND dateIn = cardDate;

但是对于这个查询,由于同一天发出的“橙色”和“黑色”牌,2013-09-05服务日期仍然会被撤销。

我尝试过搜索,但我甚至不确定如何正确描述这个问题,因此我的Google-fu失败了。任何帮助或建议将非常感谢。

2 个答案:

答案 0 :(得分:2)

最容易理解的版本会使用NOT EXISTS进行过滤:

SELECT name, dateIn
FROM   dates
WHERE  NOT EXISTS(
         SELECT *
         FROM   cards
         WHERE  cards.personID = dates.personID
            AND cards.cardDate = dates.dateIn
            AND cards.cardColor = 'red'
       )

sqlfiddle上查看。

答案 1 :(得分:0)

我有点困惑,你得到了非红色的2013-09-05排。

http://sqlfiddle.com/#!2/89260

我尝试使用内连接(如你所写)和外连接。相同的结果。

编辑: 对不起,误解了你的帖子。 eggyal的答案看起来像是我的胜利者。