我有一张表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相同的相应批号的相同标签,因此我只想要一行而不是两行。即使8888
标记101
和102
标记不同lot
,也不能考虑列表,因为它还包含标记103
。这意味着,我希望产品具有精确的101, 102
组合。简而言之,我不想要带有任何额外标签的产品,而且我不想要任何缺少标签的东西。
我怎样才能做到这一点?
答案 0 :(得分:1)
编辑:针对更新的问题修改了答案
注意:查询未经过测试
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
旧回答
您可以使用group by来实现此目的。
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)
答案 1 :(得分:0)
仅使用SELECT
子句和IN
的简单GROUP By
查询怎么样?
SELECT * FROM mytable
WHERE tag IN (101, 102)
GROUP BY tag, lot;
答案 2 :(得分:0)
试试这个:
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功能,因为我没有练习它。
答案 3 :(得分:0)
我试过这个,它避免了重复,并将tab和lot列组合在一起。尝试修改以获得所需的输出
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