Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多行具有相同键值的mysql连接查询_Mysql_Join - Fatal编程技术网

多行具有相同键值的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运算符,我得到了只点胡萝卜的人。这很奇怪。因为我现在使用我的答案中的查询运行它,并且工作得非常完美:除了“菠菜”记录外,所有记录都会显示出来。谢谢。这很有效。也许还有其他方法可以做到这一点,但我认为这是正确的答案。我也很感激,对于我这个级别的人来说,这让我意识到可以使用顺序连接。再次感谢@切斯特很酷。仅供参考,这也是最好的执行方式。