查找与另一个中的父Id列关联的表中的最常用值

时间:2015-06-02 23:09:36

标签: mysql sql

我有两个表正在加入。他们有一对多的关系。我想提出一个最常见的"很多"每个父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的值为AppleApple,{{1}在第一个表格中,如果parent_id为Orangeval 1Pear,则上面的查询会将它们分组为:

val 2val 1Apple

2val 1Orange

1val 2Pear

现在我想要的是:

1val 1Apple

2val 2Pear

我只想显示父母的最高价值。或者,如果案例中只有一个值(例如val 2),那么就显示出来。

现在,我可以在子查询中轻松完成此操作(为每个父值执行限制1;按1 DESC排序)。 然而,是否有(1)这样做的方法没有子查询?或(2)MySQL功能或其他一些方法来做到这一点?我正在努力保持这些查询非常快速和高性能。

如果您可以告诉我子查询不会妨碍这里的表现,我也会选择它作为答案。

1 个答案:

答案 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()中间值的最大长度(但您将参数设置为具有更大的值)。但是,它在很多情况下都能很好地发挥作用。