我有一个表格mytable
如下所示;
╔═════════╦══════╦═════╗
║ 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 ║
╚═════════╩══════╩═════╝
我有输入101
,102
。我想要这样的输出;
2,5
3,5
这意味着,在表中,它将查找101,102
的组合,并返回具有不同批号的完全相同的组合。除此之外,我想避免重复的行。在这里,1111
和 5555
具有相同的标签,具有相同的相应批号以 tag
s,所以我只想要一行而不是 2 行。即使8888
具有具有不同lot
的标签101
和102
,也不能考虑将其列入列表,因为它还包括标签103
。这意味着,我想要具有精确101, 102
组合的产品。简而言之,我不想要带有任何额外标签的产品,也不想要任何缺少标签的产品。
我怎样才能做到这一点?
编辑:针对更新的问题修改了答案
注意:查询未测试
SELECT GROUP_CONCAT(lot ORDER BY lot ASC SEPARATOR ',')
from mytable
having count(*) = 2
and GROUP_CONCAT(tag ORDER BY tag ASC SEPARATOR ' ') = '101 102'
group by product
旧答案
您可以使用分组依据来实现此目的。
select tag, product from mytable where tag in (101,102) group by tag, product
这也可以使用 Distinct,但您必须查看它。 我不记得在多列中是否可以不同。我认为这也行得通...
select distinct tag, product from mytable where tag in (101,102)
试试这个:
SELECT DISTINCT(CONCAT(firstTable.tag, " - ", firstTable.lot, secondTable.tag, " - ", secondTable.lot))
(SELECT tag,lot FROM mytable WHERE tag = 101) AS firstTable INNER JOIN
(SELECT tag,lot FROM mytable WHERE tag = 102) AS secondTable
ON firstTable.product = secondTable.product
WHERE firstTable.lot <> secondTable.lot
正如我从您的问题中得到的,我认为您需要具有差异批次的给定标签的相同产品
注意:我不确定CONCAT功能,因为我没有练习过它。
只用IN
子句和GROUP By
子句进行简单的SELECT
查询怎么样?
SELECT * FROM mytable
WHERE tag IN (101, 102)
GROUP BY tag, lot;
SQLFiddle
我已经尝试过这个,它可以避免重复并将选项卡和批次列分组在一起。尝试修改以获得所需的输出
SELECT DISTINCT GROUP_CONCAT(CONCAT(tag," - ",lot)) FROM mytable
WHERE tag IN (101,102) GROUP BY product ;
根据新更新的解决方案:
SELECT DISTINCT GROUP_CONCAT(m.lot) FROM mytable m
GROUP BY m.product HAVING GROUP_CONCAT(m.tag ORDER BY m.tag) = '101,102';
输出:
2,5
参考: 独特, GROUP_CONCAT
参考:MySQL 查询返回重复行