我在第三方数据库中有一个表,它有两个这样的表:
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'
如果根据我必须使用的表结构,如何编写查询以获取订购豌豆和胡萝卜的人的姓名?
答案 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 。
重要的是,您始终应该应用的原则:将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
表保持不变。
否,它应该是PEOPLE
子句中的AND
。我的错。我纠正了它。
否,它应该是WHERE
子句中的OR
。我的错。我纠正了。再次: - )))