mysql连接查询,其中多行具有相同的键值

时间:2017-05-16 00:50:16

标签: 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查询,它将返回所有订购PEAS和CARROTS的PEOPLE。结果将是:

贾马尔,马克

当我使用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'

如果根据我必须使用的表结构,如何编写查询以获取订购豌豆和胡萝卜的人的姓名?

2 个答案:

答案 0 :(得分:1)

加入两次,每次条件一次:

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'

如果history可以包含重复项,或者是防御性的,请添加DISTINCT

SELECT DISTINCT a.ID
FROM ...

答案 1 :(得分:0)

people中选择所有人,并为每个人选择history详细信息,但仅选择订阅PEAS or CARROTS的人:

当你说“ 所有 ”的人时,你总是用people表开始你的sql。当您说“ 谁拥有 ”时,您将LEFT JOIN添加到LEFT表(people){你{ {1}}来自右表(JOIN)的所需详细信息。当您说“ 但只是具有以下详细信息的 ”时,则应用过滤器,例如你使用history条款。

WHERE

注意:“ - ”表示 commentar

编辑1:

重要的是,您始终应该应用的原则:将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" ; 列重命名为history.ID并添加新列history.PEOPLE_ID作为history.ID列,以便唯一标识每个PRIMARY KEY记录。

history

HISTORY ------- ID PEOPLE_ID ORDERED 1 1 PEAS 2 1 CARROTS 3 1 SPINACH 4 2 CARROTS 5 3 PEAS 6 3 CARROTS 表保持不变。

编辑2:

否,它应该是PEOPLE子句中的AND。我的错。我纠正了它。

编辑3:

否,它应该是WHERE子句中的OR。我的错。我纠正了。再次: - )))