我在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。
答案 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会帮助您