【问题标题】:MySQL order by the same order of values in IN clauseMySQL 按 IN 子句中相同的值顺序排列
【发布时间】:2012-07-31 06:43:50
【问题描述】:

这是带有 IN 子句的简单查询。但问题是我需要以相同的 id 顺序获取输出。

SELECT GROUP_CONCAT(username) as users FROM usertable WHERE usr_id IN (54,68,46)

例如,如果我传递 54、68、46,那么 usr_id 为 54 的行应该先出现,然后是 68,然后是 46。有没有办法在 MySQL 中实现这一点?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    我们可以在 order by 子句中使用FIND_IN_SET 以像这样以相同的顺序获取值。

    SELECT `username` as users FROM usertable WHERE usr_id IN (54,68,46) ORDER BY FIND_IN_SET(`usr_id`,"54,68,46")
    

    但我不知道如何以相同的顺序GROUP_CONCAT。如果有人用这种简单的方法给出答案,我可以接受。

    【讨论】:

    • 聪明!请注意,如果列是字符串,请使用POSITION 而不是FIND_IN_SET
    【解决方案2】:

    你需要在GROUP_CONCAT中使用ORDER BY子句:

    SELECT GROUP_CONCAT(username ORDER BY user_id ASC) as users 
    FROM usertable 
    WHERE usr_id IN (54,68);
    

    【讨论】:

    • 抱歉,我不想要 ASC 或 DESC 顺序。我希望以在 IN 子句中传递的相同顺序。谢谢
    【解决方案3】:
    SELECT group_concat(username order by case when usr_id=54 
                                               then 0
                                               when usr_id=68
                                               then 1
                                               when usr_id=46
                                               then 2
                                               else 3    
                                          end) as users 
    FROM usertable
    WHERE usr_id IN (54,68,46)
    

    SQLFiddle example

    【讨论】:

    • 显示错误为You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'usertable' at line 1: usertable
    • 您是否复制了 SQLFiddle 示例中的查询?它是正确的。
    • 是的,它正在工作。但这些价值观是动态的。你对此有什么想法吗?
    • 我只会使用FIELD() - 请参阅sqlfiddle
    猜你喜欢
    • 2011-01-12
    • 2010-09-28
    • 1970-01-01
    • 2012-01-05
    • 2014-11-30
    • 1970-01-01
    • 2014-09-10
    • 1970-01-01
    相关资源
    最近更新 更多