【问题标题】:MySQL loop over table rows, run another query, join resultsMySQL 循环遍历表行,运行另一个查询,连接结果
【发布时间】:2017-11-08 22:07:06
【问题描述】:

我有一个类似my_table 的表(并且 NAME 列的值是唯一的):

ID   NAME   RANK   AGE
1    John   4      21
2    Sam    1      43
3    Tom    3      57
4    Bob    2      39
5    Dave   5      25

我想运行一个查询,对于每一行,我选择所有属性加上另一列,该列是按年龄 DESC 排序的其他名称列表,而不是本身带有 LIMIT(比如说 3),结果类似于:

NAME   RANK   AGE   SOME_LIST
John   4      21    Tom,Sam,Bob
Sam    1      43    Tom,Bob,Dave
Tom    3      57    Sam,Bob,Dave
Bob    2      39    Tom,Sam,Dave
Dave   5      25    Tom,Sam,Bob

因此,为 John 获取 SOME_LIST 的查询类似于:

SELECT name FROM my_table WHERE name <> 'John' ORDER BY age DESC LIMIT 3;

结果如下:

NAME
Tom
Sam
Bob

我不确定 1) 如何将这些结果放入以逗号分隔的单列中,以及 2) 如何对 my_table 中的每一行运行此查询。

更新:

通过这个查询更接近:

SELECT *, (SELECT GROUP_CONCAT(name) FROM my_table t1 WHERE t1.name <> t2.name ORDER BY age DESC LIMIT 3) AS some_list FROM my_table t2;

some_list 列不尊重年龄 desc 顺序,也不尊重限制。只接受&lt;&gt;

【问题讨论】:

    标签: mysql list loops subquery self-join


    【解决方案1】:

    您可以使用以下解决方案:

    SELECT m1.*, SUBSTRING_INDEX(GROUP_CONCAT(m2.name ORDER BY m2.age DESC), ',', 3) AS 'SOME_LIST'
    FROM my_table m1 LEFT JOIN my_table m2 ON m1.name <> m2.name
    GROUP BY m1.ID
    

    演示: http://sqlfiddle.com/#!9/b56945/38/0

    要获取以逗号分隔的名称列表,您可以使用GROUP_CONCAT

    SELECT SUBSTRING_INDEX(GROUP_CONCAT(name ORDER BY age DESC), ',', 3) AS 'SOME_LIST' 
    FROM my_table 
    WHERE name <> 'John';
    

    使用SUBSTRING_INDEX,您可以限制逗号分隔值的数量。您也可以将ORDER BY 的值直接放在GROUP_CONCAT 上。

    【讨论】:

    • 完美!谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-09
    相关资源
    最近更新 更多