2

我在两个表之间有 1-1 列关系,item并且log

对于每个项目,都有一个日志存储项目是否已被处理。这通过log.itemId等于 来标识item.idlog.status告诉处理是否正在进行或已完成(-1 正在等待,1 正在完成)。

在处理开始之前,log表中没有对应项目的行item

我试图简单地从日志中没有相应行(意味着处理尚未开始)或状态不是 1(意味着它的待处理)的项目中获取行。

我要疯了,想弄清楚,这是我的查询:

SELECT 
    item.id
FROM item, log
WHERE log.itemId != item.id
OR (log.itemId = item.id AND log.status !='1')
ORDER BY item.id ASC LIMIT 1

但是,这会返回一个空结果。

我究竟做错了什么?

4

4 回答 4

4

尝试这个:

SELECT 
  item.id
FROM
  item left join log on (log.itemId = item.id)
WHERE
  log.itemId is null
  OR log.status !='1'
ORDER BY item.id LIMIT 1
于 2012-12-30T17:05:18.053 回答
2

虽然提供的其他答案有效并且非常常见(外部连接和检查外部表上的 NULL),但 SQL 中还有另一种更直接适用的方法:

SELECT
item.id
FROM item
WHERE
not exists
    (SELECT itemID from log where log.itemID = item.id and log.status = '1')

我建议同时尝试并确定哪个操作更快——外连接检查 NULL 与“不存在”语法。大多数数据库不会对两个查询进行相同的优化(即使结果相同),因此一个可能会优于另一个,尽管并不总是很明显哪个更好。

请注意,我在最后一行将 != 更改为 =,但我认为这是正确的,尽管我可能误解了逻辑。

于 2012-12-30T17:18:42.613 回答
1

其中一个决定是使用 EXISTS (http://dev.mysql.com/doc/refman/5.0/en/exists-and-not-exists-subqueries.html),您可以在下面找到示例,或者您可以使用 LEFT JOIN .

SELECT *
FROM item AS i
WHERE NOT EXISTS(
    SELECT *
    FROM log AS l
    WHERE l.itemId = i.id
        AND l.status != 1
)
LIMIT 0, 1;
于 2012-12-30T17:09:00.813 回答
0

这是另一种方法:

SELECT item.id FROM item WHERE item.id NOT IN (SELECT itemid FROM log where log.status != '1')
于 2012-12-30T17:10:37.393 回答