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
我在 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)
我希望结果有 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