按总计列中的最低值排序,按年份在另一列上使用 GROUP BY

Order By Lowest Value in total column, by year with GROUP BY on another column

我的 Table 如下所示:

我正在使用以下查询在 table (front-end) 中输出此数据:

SELECT developer, GROUP_CONCAT(year) AS years, GROUP_CONCAT(total) AS totals, SUM(IFNULL(total, 0)) AS totals_sum
    FROM wp_infraexchange_market_pivots
    WHERE market_id = 2
    GROUP BY developer
    ORDER BY totals_sum DESC
    LIMIT 20;

这给我的输出如下所示:

但是,我需要输出相同的数据,但行按给定年份的最低总数排序。因此,如果我想获得从 2012 年最低 total 列开始排序的结果,并按 ASC 顺序对其进行排序,我该如何在 MySQL 查询中执行此操作?这可能吗?

@scais - 已尝试您的回答,但得到以下结果:

这看起来非常接近我的需要,但我仍然需要 GROUP_CONCAT 才能工作。

好的,所以切换到 SELECT 中的 CASE 语句,它几乎可以正常运行...

SELECT developer, GROUP_CONCAT(year) AS years, GROUP_CONCAT(total) AS totals, SUM(IFNULL(total, 0)) AS totals_sum, 
CASE WHEN year = 2013 
    THEN total 
    ELSE NULL 
END AS year_total
        FROM wp_infraexchange_market_pivots
        WHERE market_id = 2
        GROUP BY developer
        ORDER BY year_total ASC
        LIMIT 20;

上面输出 2012 年的正确顺序和数据,但是如果我将其更改为 2013 我没有得到正确的顺序。不知道为什么。但是顺序有缺陷,当我将其更改为 2015 年、2016 年时,它 return 顺序不正确。只有 return 是 2012 年的正确顺序。我认为这里发生的是它 return 仅在它发现的第一年的正确数据,而不是所有其他年份,它 return s NULL,这打乱了大于 2012 年(最低年份)的年份顺序,但不确定如何解决此问题。

这是我试图通过此查询实现的图片,您可以在其中单击每列的 header 并按年份按升序或降序排列:

试试这个:

SELECT developer, GROUP_CONCAT(year) AS years, GROUP_CONCAT(total) AS totals, SUM(IFNULL(total, 0)) AS totals_sum
    FROM wp_infraexchange_market_pivots
    WHERE market_id = 2
    GROUP BY developer
    ORDER BY totals_sum DESC, years ASC
    LIMIT 20;

您可能需要年限(总计)的订单

    SELECT developer, GROUP_CONCAT(year) AS years, GROUP_CONCAT(total) AS totals, SUM(IFNULL(total, 0)) AS totals_sum
    FROM wp_infraexchange_market_pivots
    WHERE market_id = 2
    GROUP BY developer
    ORDER BY GROUP_CONCAT(year), min(total),  totals_sum DESC
    LIMIT 20;

谢谢大家,但我是这样想出来的,而且效果很好:

SELECT developer, GROUP_CONCAT(year) AS years, GROUP_CONCAT(total) AS totals, SUM(IFNULL(total, 0)) AS totals_sum, CASE WHEN year = 2016 THEN total ELSE NULL END AS year_total
    FROM wp_infraexchange_market_pivots
    WHERE market_id = 2
    GROUP BY developer
    ORDER BY MIN(year_total) ASC
    LIMIT 20;

这会将 2016 年所有 total 中的结果按升序从低到高排序(保持开发者唯一)。现在我可以简单地删除 2016 年并放入任何一年,如果我想从最高到最低,我只是将 ORDER BY MIN(year_total) ASC 更改为 ORDER BY MAX(year_total) DESC,一切都很完美!

猜猜,这里需要一个 CASE 声明!感谢大家的努力!