php – MySQL查询根据特定标记组合在获取行时返回不需要的行

我在Windows 8 PC中运行PHP MySQL.我有一张像下面的表格;

╔═════════╦══════╦═════╗
║ product ║ tag  ║ lot ║
╠═════════╬══════╬═════╣
║ 1111    ║ 101  ║ 2   ║ 
║ 1111    ║ 102  ║ 5   ║ 
║ 2222    ║ 103  ║ 6   ║ 
║ 3333    ║ 104  ║ 2   ║  
║ 4444    ║ 101  ║ 2   ║ 
║ 5555    ║ 101  ║ 2   ║ 
║ 5555    ║ 102  ║ 5   ║ 
║ 6666    ║ 102  ║ 2   ║ 
║ 6666    ║ 103  ║ 5   ║
║ 7777    ║ 101  ║ 2   ║ 
║ 7777    ║ 102  ║ 5   ║ 
║ 7777    ║ 103  ║ 6   ║ 
║ 8888    ║ 101  ║ 1   ║ 
║ 8888    ║ 102  ║ 3   ║ 
║ 8888    ║ 103  ║ 5   ║ 
║ 9999    ║ 101  ║ 6   ║ 
║ 9999    ║ 102  ║ 8   ║
╚═════════╩══════╩═════╝

我有输入101,102.我希望输出像;

2,5
6,8

查询将查找组合101,102,并返回具有不同批号的完全相同的组合.除此之外,我想避免重复的行.这里1111和5555具有相同的标签,相同的批号与标签相同(具有相同批次的完全相同的组合),所以我只想要一行而不是两行.即使8888具有不同批次的标签101和102,也不能考虑列表,因为它还包括标签103.简而言之,我想要的产品具有精确的101,102组合,而且我不想要带有任何额外标签的产品,而且我不想要任何缺少标签的东西.

我有一个像下面的查询;

SELECT DISTINCT GROUP_CONCAT(m.lot) FROM mytable m
WHERE m.tag IN (101,102) 
AND (SELECT COUNT(m.product) FROM mytable m2 WHERE m.product = m2.product)>1
GROUP BY m.product;

返回;

2,5
2
5,2
1,3
6,8

我怎样才能解决这个问题?有没有更好的方法来完成我正在寻找的东西?

这是从http://sqlfiddle.com/#!9/d11d6开始的小提琴

最佳答案
我建议使用简单连接:

SELECT DISTINCT a.lot, b.lot
FROM mytable a
    INNER JOIN mytable b ON b.product = a.product AND NOT EXISTS (SELECT * FROM product WHERE tag NOT IN (a.tag, b.tag))
WHERE a.tag = 101 and b.tag = 102

转载注明原文:php – MySQL查询根据特定标记组合在获取行时返回不需要的行 - 代码日志