如何根据列值组合检索唯一行


How to retrieve unique rows based on column value combinations?

我有一个表格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   ║ 
╚═════════╩══════╩═════╝

我有输入101102。我想要这样的输出;

2,5
3,5

这意味着,在表中,它将查找101,102的组合,并返回具有不同批号完全相同的组合。除此之外,我想避免重复的行。在这里,11115555 具有相同的标签,具有相同的相应批号以 tag s,所以我只想要一行而不是 2 行。即使8888具有具有不同lot的标签101102,也不能考虑将其列入列表,因为它还包括标签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 查询返回重复行