首页 文章

MySQL循环遍历表行,运行另一个查询,加入结果

提问于
浏览
1

我有一个表 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 中的每一行运行此查询 .

UPDATE:

更接近这个查询:

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 列不遵守年龄描述顺序,也不尊重限制 . 只接受 <> .

1 回答

  • 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
    

    demo: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 ,您可以限制逗号分隔值的数量 . 您也可以直接在 GROUP_CONCATORDER BY .

相关问题