可以找到相同组的计数。你可以第一组的行通过group_id
和GROUP_CONCAT的item_id
值:
SELECT
group_id,
GROUP_CONCAT(item_id ORDER BY id) AS item_list
FROM atable
GROUP BY
group_id
;
这会给你一个结果集是这样的:
group_id item_list
-------- ---------
1 1,2,3
2 1,2,3
3 2,1,3
4 3,2,1
5 1,2,3,4
现在是容易得到的条目数为每不同的项目清单:
SELECT
item_list,
COUNT(*) AS nr_times
FROM (
SELECT
group_id,
GROUP_CONCAT(item_id ORDER BY id) AS item_list
FROM atable
GROUP BY
group_id
) AS s
GROUP BY
item_list
;
并且查询返回:
item_list nr_times
--------- --------
1,2,3 2
1,2,3,4 1
2,1,3 1
3,2,1 1
这不是您之后的输出,因为您需要组ID旁边的计数。因此,需要被连接到前行集中的最后一行设置:
SELECT
groups.group_id,
counts.nr_times
FROM (
SELECT
group_id,
GROUP_CONCAT(item_id ORDER BY id) AS item_list
FROM atable
GROUP BY group_id
) AS groups
INNER JOIN (
SELECT
item_list,
COUNT(*) AS nr_times
FROM (
SELECT GROUP_CONCAT(item_id ORDER BY id) AS item_list
FROM atable
GROUP BY group_id
) AS s
GROUP BY item_list
) AS counts
ON groups.item_list = counts.item_list
;
输出:
group_id nr_times
-------- --------
1 2
2 2
3 1
4 1
5 1
在这一点上,很明显,分组同一组两次可能不是一个非常好的主意。也许这将是更好的第一分组的结果存储到一个临时表,然后用它来得到最终结果:
CREATE TEMPORARY TABLE temp_results
AS
SELECT
group_id,
GROUP_CONCAT(item_id ORDER BY id) AS item_list
FROM atable
GROUP BY
group_id
;
SELECT
groups.group_id,
counts.nr_times
FROM temp_results AS groups
INNER JOIN (
SELECT
item_list,
COUNT(*) AS nr_times
FROM temp_results
GROUP BY item_list
) AS counts
ON groups.item_list = counts.item_list
;
我们得到的数字,如您所需的输出,你可以尝试匹配两套与LIKE,像这样:
SELECT
groups.group_id,
counts.nr_times
FROM temp_results AS groups
INNER JOIN (
SELECT
item_list,
COUNT(*) AS nr_times
FROM temp_results
GROUP BY item_list
) AS counts
ON CONCAT(',', groups.item_list, ',') LIKE CONCAT('%,', counts.item_list, ',%')
OR CONCAT(',', counts.item_list, ',') LIKE CONCAT('%,', groups.item_list, ',%')
;
上述会给你以下几点:
group_id nr_times
-------- --------
1 2
1 1
2 2
2 1
3 1
4 1
5 2
5 1
很显然,你现在只需要坚持
GROUP BY groups.group_id
在最后一个查询的结束,以及
SUM(counts.nr_times) AS order_used_nr_times
更换counts.nr_times
在SELECT子句,以获得相同的输出你的问题:
group_id order_used_nr_times
-------- -------------------
1 3
2 3
3 1
4 1
5 3
但是请注意,如果您有包含项目1,2,3
,3,4,5
和1,2,3,4,5,6
的组,则上次查询中使用的LIKE加入条件将与前两个组中的任意一个匹配只有第三个,而不是彼此,而第三个组将与前两个组匹配。
我不确定这是否符合您的要求,因为我仍然无法在那个特定的问题上作出解释(对不起)。我希望这篇文章至少能给你一些想法,最终如何才能取得正确的结果。
我想用变量将是解决http://dev.mysql.com/doc/refman/5.0/en/user-variables.html – biziclop
除非我误解,一个简单的GROUP BY应该足够了:'SELECT COUNT (*),group_id FROM MyTable GROUP BY COUNT(*)' – cbeckner
您可以扩展一些关于如何从示例数据获得预期输出的信息吗?一直盯着这几分钟,现在仍然没有得到你想要的...... –