多行具有相同键值的mysql连接查询
我在第三方数据库中有一个表,它有两个表,如下所示:多行具有相同键值的mysql连接查询,mysql,join,Mysql,Join,我在第三方数据库中有一个表,它有两个表,如下所示: HISTORY ======== ID | ORDERED 1 PEAS 1 CARROTS 1 SPINACH 2 CARROTS 3 PEAS 3 CARROTS PEOPLE ===== ID | NAME 1 Jamal 2 Sharon 3 Mark 我正在尝试创建一个MYSQL查询,它将返回所有同时订购豌豆和胡萝卜的人。结果将是: 杰马尔,马克 当我尝试使用OR运算符时,我得
HISTORY
========
ID | ORDERED
1 PEAS
1 CARROTS
1 SPINACH
2 CARROTS
3 PEAS
3 CARROTS
PEOPLE
=====
ID | NAME
1 Jamal
2 Sharon
3 Mark
我正在尝试创建一个MYSQL查询,它将返回所有同时订购豌豆和胡萝卜的人。结果将是:
杰马尔,马克
当我尝试使用OR运算符时,我得到了所有三个人:
SELECT a.ID from people a
INNER JOIN history b on a.ID=b.ID
WHERE b.ordered='PEAS' OR b.ordered='CARROTS'
当我尝试使用AND操作符时,我找不到任何人
SELECT a.ID from people a
INNER JOIN history b on a.ID=b.ID
WHERE b.ordered='PEAS' AND b.ordered='CARROTS'
鉴于我必须使用的表结构,如何编写查询以获取订购豌豆和胡萝卜的人员的姓名?连接两次,每个条件一次:
SELECT a.ID
FROM people a
JOIN history b on a.ID=b.ID AND b.ordered='PEAS'
JOIN history c on a.ID=c.ID AND c.ordered='CARROTS'
如果历史记录
可能包含重复项,或者为了防御,请添加独特的
:
SELECT DISTINCT a.ID
FROM ...
从
people
中选择所有人员,并为每个人员选择历史记录
详细信息,但仅选择订购豌豆或胡萝卜的人员
:
当您说“all”people时,您总是以people
表开始sql。当你说“谁拥有”时,你就添加了左连接
,例如在左连接
表(人
)中,你从右表(历史
)中连接所需的详细信息。当你说“但只有那些具有以下详细信息的””时,你应用了一个过滤器,例如,你使用了WHERE
子句
SELECT
peo.ID, -- OPTIONAL
peo.NAME,
his.ID, -- OPTIONAL
his.ORDERED
FROM people AS peo
LEFT JOIN history AS his ON his.ID = peo.ID
WHERE
his.ORDERED = "PEAS" OR
his.ORDERED = "CARROTS"
;
注:“--”指注释
编辑1:
重要提示:您应该始终应用一个原则:将history.ID
列重命名为history.PEOPLE\u ID
,并将一个新列history.ID
添加为主键列,以便唯一标识每个历史记录
HISTORY
-------
ID PEOPLE_ID ORDERED
1 1 PEAS
2 1 CARROTS
3 1 SPINACH
4 2 CARROTS
5 3 PEAS
6 3 CARROTS
人员
表保持不变
编辑2:
否否,它应该是WHERE
子句中的和
。是我的错。我纠正了它
编辑3:
否否,它应该是WHERE
子句中的或。是我的错。我纠正了它。再次:-)谢谢。结果为零。这似乎是在历史记录表中查找匹配的ID,然后在该行中查找豌豆和胡萝卜。感谢您对最佳实践的建议,历史记录表中有一个唯一的键,我只是为了这个问题简化了它。@Chester,不客气!现在,先不要使用WHERE
子句,告诉我你是否收到了什么。是的,应该是或!我的错误。我已经更正了from或to和:-)请使用或。您好,是的,我得到的结果没有where子句。使用OR运算符,我得到了只点胡萝卜的人。这很奇怪。因为我现在使用我的答案中的查询运行它,并且工作得非常完美:除了“菠菜”记录外,所有记录都会显示出来。谢谢。这很有效。也许还有其他方法可以做到这一点,但我认为这是正确的答案。我也很感激,对于我这个级别的人来说,这让我意识到可以使用顺序连接。再次感谢@切斯特很酷。仅供参考,这也是最好的执行方式。