选择另一个表中没有匹配项的项

时间:2013-08-09 10:08:11

标签: mysql sql

                          Tables
 _________________________       _________________________
|__________items__________|     |_______readStatus________|
|___itemId___|____data____|     |___itemId___|___status___|
| 1          | cats       |     | 1          | 1          |
| 2          | dogs       |     | 2          | 1          |
| 3          | fish       |     |            |            |
 -------------------------       -------------------------

我有两个类似于上面显示的MySQL表。我需要从item表中获取status表中没有相应1 readStatus的条目。因此,在此示例中,我需要datafish的条目。我对SQL不是很熟悉,所以我不确定如何解决这个问题,但基于我提出的其他问题:

SELECT * 
FROM items
INNER JOIN
readStatus
ON  items.itemId = readStatus.itemId
WHERE readStatus.status != 1

这不起作用,因为它会跳过items表中readStatus表中没有匹配条目的任何条目。添加status 0条目进行搜索不是一种选择,因为它最终会创建数百万条目。另外看起来,在phpMyAdmin中,它将条目合并到一个我不想要的输出中,但它不是一个破坏者。

感谢任何帮助。

5 个答案:

答案 0 :(得分:4)

使用LEFT JOIN而不是INNER JOIN:

SELECT * 
FROM items
LEFT JOIN   //left join
readStatus
ON  items.itemId = readStatus.itemId
WHERE (readStatus.status != 1 OR readStatus.status IS NULL);

阅读LEFT JOIN教程。

答案 1 :(得分:4)

实际上,这听起来像是用EXIST而不是(左)连接更好地解决的问题:

SELECT * 
FROM items
WHERE NOT EXISTS ( SELECT *
                  FROM readStatus
                  WHERE items.itemId = readStatus.itemId
                  AND readStatus.status = 1 )

答案 2 :(得分:0)

SELECT * FROM items LEFT JOIN readStatus ON items.itemId = readStatus.itemId
WHERE readStatus.itemId IS NULL

答案 3 :(得分:0)

WHERE readStatus IS NULL或readStatus.status!= -1

答案 4 :(得分:0)

您必须使用LEFT JOIN

SELECT * FROM items LEFT JOIN readStatus ON  items.itemId = readStatus.itemId and readStatus.status != 1;

这将如何运作。

从readStatus开始,只需要具有匹配的itemId并且不在状态1中的所有行wrom项目表。