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

时间:2016-01-19 08:36:22

标签: php mysql

我有一张表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相同的相应批号的相同标签,因此我只想要一行而不是两行。即使8888标记101102标记不同lot,也不能考虑列表,因为它还包含标记103。这意味着,我希望产品具有精确的101, 102组合。简而言之,我不想要带有任何额外标签的产品,而且我不想要任何缺少标签的东西。

我怎样才能做到这一点?

4 个答案:

答案 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;

SQLFiddle

答案 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

参考:DISTINCTGROUP_CONCAT

参考:MySQL query returns duplicate rows