1
                          表
 _________________________ _________________________
|__________项目__________| |_______读取状态________|
|___itemId___|____数据____| |___itemId___|___状态___|
| 1 | 猫 | | 1 | 1 |
| 2 | 狗| 高分辨率照片| CLIPARTO | 2 | 1 |
| 3 | 鱼| 高分辨率照片| CLIPARTO | | |
 ------------------------- -------------

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

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

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

任何帮助表示赞赏。

4

5 回答 5

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教程。

于 2013-08-09T10:10:50.560 回答
4

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

SELECT * 
FROM items
WHERE NOT EXISTS ( SELECT *
                  FROM readStatus
                  WHERE items.itemId = readStatus.itemId
                  AND readStatus.status = 1 )
于 2013-08-09T10:38:19.077 回答
0

其中 readStatus 为 NULL 或 readStatus.status != -1

于 2013-08-09T10:12:43.410 回答
0

您必须使用 LEFT JOIN

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

这将如何工作。

当从 readStatus 只取具有匹配 itemId 且不处于状态 1 的行时,它将取 items 表中的所有行。

于 2013-08-09T10:22:36.600 回答
0
SELECT * FROM items LEFT JOIN readStatus ON items.itemId = readStatus.itemId
WHERE readStatus.itemId IS NULL
于 2013-08-09T10:10:44.720 回答