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

时间:2016-02-17 08:58:42

标签: mysql sql database join exists

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

我有两张桌子:

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

Current_stock描述了实际库存和stock_record已经库存的商品。

当我想把文章留给库存时(问题是在current_stock中而不是在stock_record中),以及当我得到多个相同的文章时,问题出现了~_

我试过了:

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”用current_id排除了current_stock中的所有行。

我想只排除stock_record

中的行数

例如:

我的current_stock中有10篇文章(article_id = 8315)
我已经在stock_record中扫描了3篇文章(使用article_id = 8315)

我希望结果有7行本文_id。

3 个答案:

答案 0 :(得分:1)

您正确的exists()查询:

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

您的查询中的问题是,您需要检查stock_record中是否存在特定 ID,而不是存在任何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)

答案 1 :(得分:1)

您可以使用变量枚举记录。然后加入行号并忽略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

答案 2 :(得分:0)

尝试按current_stock分组

This link会帮助您