Mysql : 如何使用左连接查找不重复的行?

Mysql : How to find non duplicate rows with left join?

我在 Mysql 正弦几天内遇到了一个问题,我无法解决它(我对 DB 很糟糕),我希望你能帮助我 :) 我将简化问题,以便您可以看到我卡在哪里!

我有两个表:

current_stock (article_id, ...)
stock_record (id, article_id)

Current_stock描述实际库存和stock_record已经盘点的物品。

当我想将物品留存(那些在 current_stock 但不在 stock_record 中),并且当我得到多个相同的物品时,问题就来了 articles_id

我试过了:

SELECT * 
FROM current_stock 
WHERE NOT EXISTS (
SELECT * FROM stock_record)

和其他形式如:

SELECT *
FROM current_stock
LEFT JOIN (SELECT * FROM stock_record) second
WHERE second.article_id IS NULL

但是,当 current_stock 中有多行具有相同的 article_id,并且 stock_record 中有一行具有此 article_id,我不是取得好成绩!

例如:

current_stock (article_id)
8315
8315
8315

stock_record (id, article_id)
15, 8315

我希望结果有两行 article_id 8315 !

(对不起,我的英语不好,希望你们理解我!)

编辑:

使用这些表格我没有得到任何结果,因为 "NOT EXISTS" 或 "LEFT JOIN" 使用此 article_id 排除了 current_stock 中的所有行。

我只想排除 stock_record

中的行数

例如:

我的 current_stock 中有 10 篇文章(其中 article_id = 8315)
我的 stock_record(article_id = 8315)

中已经扫描了 3 篇文章

我希望结果有 7 行 article_id。

您正确的 exists() 查询:

SELECT * 
FROM current_stock t
WHERE NOT EXISTS (SELECT * FROM stock_record s
                   where t.article_id = s.article_id)

您的查询中的问题,您需要检查 特定的 id 是否不存在于 stock_record 中,而不是如果那里不存在任何 id。

你的正确左连接查询:

SELECT *
FROM current_stock s
LEFT JOIN stock_record t on( t.article_id = s.article_id)
WHERE t.id IS NULL

您的左连接查询的问题是您没有指定关系条件(请参阅 ON()),因此它不知道将哪一行连接到哪一行。

你也可以像这样使用 NOT IN:

SELECT *
FROM current_stock t
WHERE article_id NOT IN(SELECT article_id FROM stock_record)

尝试按 current_stock

分组

This link会帮助你

您可以使用变量来枚举记录。然后加入行号并忽略在 stock_record:

中匹配的行
SELECT t1.*
FROM (
  SELECT *, 
         @rn1 := IF(@aid = article_id, @rn1 + 1,
                    IF(@aid := article_id, 1, 1)) AS rn1
  FROM current_stock 
  CROSS JOIN (SELECT @rn1 := 0, @aid := 0) AS vars
  ORDER BY article_id) AS t1
LEFT JOIN (
  SELECT article_id, 
         @rn2 := IF(@aid = article_id, @rn2 + 1,
                    IF(@aid := article_id, 1, 1)) AS rn2
  FROM stock_record 
  CROSS JOIN (SELECT @rn2 := 0, @aid := 0) AS vars
  ORDER BY article_id
) AS t2 ON t1.article_id = t2.article_id AND t1.rn1 = t2.rn2
WHERE t2.article_id IS NULL