我有两个表正在加入。他们有一对多的关系。我想提出一个最常见的"很多"每个父ID的表。
我有一个这样的查询,它处于我想要做的开始阶段:
SELECT p.profile, up.value, COUNT(*) AS theCount FROM `profiles` AS p
JOIN user_profile AS up ON p.id = up.profile_id
GROUP BY `profile`, `value`
ORDER BY p.profile ASC, theCount DESC;
现在这个查询的问题在于它将显示来自多个表的所有值,并且只是将它们分组为最多或最少。例如:
如果表格profile
的值为val 1
,则val 2
和表格user_profiles
的值为Apple
,Apple
,{{1}在第一个表格中,如果parent_id为Orange
,val 1
为Pear
,则上面的查询会将它们分组为:
val 2
,val 1
,Apple
2
,val 1
,Orange
1
,val 2
,Pear
现在我想要的是:
1
,val 1
,Apple
2
,val 2
,Pear
我只想显示父母的最高价值。或者,如果案例中只有一个值(例如val 2),那么就显示出来。
现在,我可以在子查询中轻松完成此操作(为每个父值执行限制1;按1
DESC排序)。 然而,是否有(1)这样做的方法没有子查询?或(2)MySQL功能或其他一些方法来做到这一点?我正在努力保持这些查询非常快速和高性能。
如果您可以告诉我子查询不会妨碍这里的表现,我也会选择它作为答案。
答案 0 :(得分:2)
对于这类问题,我认为group_concat()
/ substring_index()
技巧是MySQL中最简单的方法:
SELECT profile, substring_index(group_concat(up.value order by theCount desc), ',', 1) as MostCommonValue,
theCount
FROM (SELECT p.profile, up.value, COUNT(*) AS theCount
FROM `profiles` p JOIN
user_profile up
ON p.id = up.profile_id
GROUP BY `profile`, `value`
) pv
GROUP BY profile
ORDER BY p.profile ASC, theCount DESC;
这种方法有缺点。例如,如果value
可以包含逗号,则需要使用不同的分隔符。更重要的是,group_concat()
中间值的最大长度(但您将参数设置为具有更大的值)。但是,它在很多情况下都能很好地发挥作用。