Php 为什么这个MySQL查询只在输入按特定顺序时返回结果?

Php 为什么这个MySQL查询只在输入按特定顺序时返回结果?,php,mysql,sql,join,Php,Mysql,Sql,Join,我有一个表mytable,如下所示 ╔═════════╦══════╦═════╗ ║ product ║ tag ║ lot ║ ╠═════════╬══════╬═════╣ ║ 1111 ║ 101 ║ 2 ║ ║ 1111 ║ 102 ║ 5 ║ ║ 2222 ║ 103 ║ 6 ║ ║ 3333 ║ 104 ║ 2 ║ ║ 4444 ║ 101 ║ 2 ║ ║ 5555 ║ 101 ║ 2 ║

我有一个表
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   ║ 
║ 9999    ║ 101  ║ 6   ║ 
║ 9999    ║ 102  ║ 8   ║
╚═════════╩══════╩═════╝
我有一个疑问像

select distinct group_concat(lot order by lot)
from `mytable`
group by product
having group_concat(tag order by tag) = '101,102';
它应该给我一个输出,比如

2,5
6,8
查询将查找组合
101102
,并返回带有不同批号的完全相同的组合。除此之外,我还希望避免重复行。这里的
1111
5555
具有相同的标签,与
tag
s具有相同的对应批号(具有相同批次的完全相同的组合),因此我只需要一行而不是两行。即使,
8888
有标签
101
102
具有不同的
批次
s,也不能考虑将其列入清单,因为它还包括标签
103
。简言之,我希望产品具有精确的
101、102
组合,我不希望产品具有任何额外的标签,我也不希望任何缺少标签的产品

代码运行良好。但有一个问题。如果我输入
101102
,查询工作正常。但是如果我将
102101
作为输入,那么我不会得到任何行,但我希望得到与前一个条件相同的精确结果,忽略给定标记号的顺序。此外,有时可以有两个以上的数字作为输入,如
101102103
101102103104


我该怎么做?如果您还喜欢PHP解决方案,这里有一把小提琴。。。。一种可能的解决方案是通过php对combition进行排序,并将值格式化为字符串中的值序列

$tmp = explode(',', '101,102,103,104');
sort($tmp);
$myComb = implode(',',$tmp);

$sql="select distinct group_concat(lot order by lot)
from `mytable`
having group_concat(tag order by tag) = " . myComb . " ; ";

虽然我倾向于使用php和mysql的组合,但我想我会玩一玩,看看是否能想出一个纯SQL版本:-

SELECT DISTINCT GROUP_CONCAT(lot ORDER BY lot)
FROM `mytable`
GROUP BY product
HAVING COUNT(DISTINCT IF(FIND_IN_SET(tag, '101,102'), tag, NULL)) = 1 + LENGTH('101,102') - LENGTH(REPLACE('101,102', ',', ''))
AND COUNT(tag) = 1 + LENGTH('101,102') - LENGTH(REPLACE('101,102', ',', ''));

这与逗号分隔的值列表的顺序无关。但这不会有效率

我觉得我们以前已经讨论过这个问题,因为您已经生成了group_concat(),它对您想要的记录进行分组,但它就像字符串一样。在您的示例中,当您传递值101102时,您的查询会将_concat()分组并返回101102的结果并进行比较。但是,当您传递数据102101时,该查询与101102的组_concat()相同,并将其与102101进行比较,因此这是字符串,您无法获得正确的结果。您在将标记连接到字符串之前对其进行显式排序,然后比较字符串,因此,您所比较的值必须按顺序排列,如果在同一查询中看到DISTINCT和GROUP BY,则至少会响起警报。这会使情况变得更糟:-(@草莓是的..谢谢我刚刚复制了OP的查询我正在寻找排序解决方案..无论如何我已经升级了然后回答..@草莓查询但是group by是正确的..可能是OP需要的..这不会改变我建议的意义..如果你比较一个排序结果,你需要一个排序匹配价值..我怀疑问题在于OP并不真正知道他们需要什么。当他们弄明白这一点时,我认为我们可能能够提供更权威的答案。