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并不真正知道他们需要什么。当他们弄明白这一点时,我认为我们可能能够提供更权威的答案。