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

Mysql:如何使用左连接查找不重复的行?,mysql,sql,database,join,exists,Mysql,Sql,Database,Join,Exists,有几天我在Mysql sine中遇到了一个问题,我无法解决它(我对DB的使用非常糟糕),我希望您能帮助我:) 我将简化这个问题,这样你就可以看到我的困境了 我有两张桌子: current_stock (article_id, ...) stock_record (id, article_id) 当前库存描述实际库存,库存记录已盘点的物品 当我想把物品留到库存时(这些物品在当前库存中,但不在库存记录中),当我得到多个相同的物品id时,问题就出现了 我试过: SELECT * FROM curr

有几天我在Mysql sine中遇到了一个问题,我无法解决它(我对DB的使用非常糟糕),我希望您能帮助我:) 我将简化这个问题,这样你就可以看到我的困境了

我有两张桌子:

current_stock (article_id, ...)
stock_record (id, article_id)
当前库存描述实际库存,库存记录已盘点的物品

当我想把物品留到库存时(这些物品在当前库存中,但不在库存记录中),当我得到多个相同的物品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
但是,当当前库存中有多行具有相同的文章id,而库存记录中有一行具有此文章id时,我不会得到好结果

例如:

current_stock (article_id)
8315
8315
8315

stock_record (id, article_id)
15, 8315
我希望结果有两行,带有文章\u id 8315

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

编辑:

对于这些表单,我没有得到任何结果,因为“notexists”或“LEFT JOIN”排除了当前库存中具有此文章id的所有行

我只想排除库存记录中的行数

例如:

我目前的库存中有10篇文章(文章id=8315)
我的库存记录中已经扫描了3篇文章(文章id=8315)

我希望结果包含这篇文章的7行id。

您正确的exists()查询:

查询中的问题是,您需要检查stock_记录中是否存在特定的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)

尝试按当前库存进行分组


将帮助您

您可以使用变量枚举记录。然后在行号上加入,并忽略在
库存记录中有匹配项的行

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

物品id=8315
现有库存的三项记录有什么区别?我的意思是,你怎么知道这两个是好的,第三个是坏的?如果你在当前库存中有多个项目,我想你需要在两个表中都有一个行项目id(唯一),以确定库存记录中存在哪些项目。我不需要告诉谁是好的,我只需要在结果中返回具有此Id的大量行。对于同一篇文章,nrResult=nrCurrentStock-nrStockRecord_id@DorianP. 那么你只是在找一个号码,我是说不是整排都有那篇文章,在您的示例中,您想要的是数字2?因为这是当前库存中该id的可用计数?请检查我的答案。我想这是你想要的。是的,事实上我做了你说的,但结果并不是我所期望的。我需要“计算”一个article\u id的出现次数。我认为这将给出与OP中的查询相同的结果,因为您使用article\u id。@DorianP。什么给了你一个错误的结果?这些问题很好。。japongskie你是什么意思?我还添加了一个非IN解决方案我期望的结果是一组包含n行的行,其中包含这篇文章的\u id,其中:n=这篇文章的当前库存行数\u id减去这篇文章的库存记录行数\u id,有可能吗?非常感谢,你是上帝!
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