MYSQL - GROUP_CONCAT 和 FIND_IN_SET 混合值/顺序?

Posted

技术标签:

【中文标题】MYSQL - GROUP_CONCAT 和 FIND_IN_SET 混合值/顺序?【英文标题】:MYSQL - GROUP_CONCAT AND FIND_IN_SET are mixing values/order? 【发布时间】:2014-09-18 06:43:22 【问题描述】:

我有以下问题:我尝试选择用户所做的所有投票并将它们放在一列中。我为此使用GROUP_CONCAT,但不知何故它混合了值顺序。

这是 SQL 代码:

SELECT 
    GROUP_CONCAT(DISTINCT options.option_name SEPARATOR ',') AS selected,
    user_login.firstname, user_login.lastname,
    event.event_title
FROM
    options, user_login, event, votes, questions
WHERE
    event.id = ? AND questions.Event_id = event.id 
    AND votes.user_id = user_login.id AND votes.question_id = questions.id 
    AND FIND_IN_SET(options.id, selected)

分组依据 user_login.id 订购方式 user_login.class

投票的示例值为:

id |  event_id  | question_id  |  selected   |  user_id
25       14           42          52,46,41         1
26       14           43             68            1

选项是这样的:

id |  option_name   | question_id
 40        Project A          42
 41        Project B          42
 46        Project C          42     
 52        Project D          42
 67        Hello              43
 68        Bye                43

问题是这样的:

id  |  question_name  | event_id
42     Project Number       14
43     Greeting             14

事件是这样的:

id  |  title
14     Project Testing

给定代码的输出是:

selected                            |  event_title
Project C, Bye, ProjectD, Project B      Test

我怎样才能保持原来的顺序,以便它输出我: D项目,C项目,B项目,再见?

【问题讨论】:

你能提供一些实际数据吗?喜欢与您想要的输出相对应的数据吗? 我添加了一些真实数据 Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已替换为 ANSI 中的 proper ANSI JOIN 语法-92 SQL 标准(20 多年前),不鼓励使用它 【参考方案1】:

这样的东西会起作用吗?基本上你说按字段值排序并使它们看起来像'52','46',......等等。

SELECT 
    GROUP_CONCAT(DISTINCT options.option_name 
                 ORDER BY FIELD( options.id, 
                                 concat('"', 
                                        replace(selected, ',', '","'),
                                        '"') 
                               ) 
                 SEPARATOR ','
                ) AS selected,
    user_login.firstname, user_login.lastname,
    event.event_title
FROM options, user_login, event, votes, questions
WHERE event.id = ? AND questions.Event_id = event.id 
  AND votes.user_id = user_login.id AND votes.question_id = questions.id 
  AND FIND_IN_SET(options.id, selected)
GROUP BY user_login.id
ORDER BY user_login.class

编辑:

我首选的方法是创建一个包含字符串的变量。它更易于阅读,并且您可以确保它以这种方式执行正确的顺序。

SET @order_field := (
    SELECT 
        group_concat(
            CONCAT('"', replace(selected, ',', '","'), '"')
        ) 
    FROM votes);

那么查询会更容易阅读...

SELECT 
    GROUP_CONCAT(DISTINCT options.option_name 
                 ORDER BY FIELD( options.id, @order_field) 
                 SEPARATOR ','
                ) AS selected,
    user_login.firstname, user_login.lastname,
    event.event_title
FROM options, user_login, event, votes, questions
WHERE event.id = ? AND questions.Event_id = event.id 
  AND votes.user_id = user_login.id AND votes.question_id = questions.id 
  AND FIND_IN_SET(options.id, selected)
GROUP BY user_login.id
ORDER BY user_login.class

【讨论】:

这与我的查询有某种相同的输出: @BufferOverflow 你用变量试过了吗?为我工作 我不得不将 o.id 替换为 options id,然后我尝试了查询,但输出与前面提到的相同。 @BufferOverflow 嗯不知道为什么它与我的不同。我得到了正确的结果。也许它与您的用户表有关? @BufferOverflow 尝试手动写入它们,看看是否可行。又名ORDER BY FIELD( orders.id, 52,46,41,68)

以上是关于MYSQL - GROUP_CONCAT 和 FIND_IN_SET 混合值/顺序?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 使用 JOIN 和 GROUP_CONCAT

MySQL:使用 JOIN 和 GROUP_CONCAT 进行更新

Mysql 中的group_concat函数的使用及陷阱

Mysql 中的group_concat函数的使用及陷阱

MySQL - GROUP_CONCAT 返回重复数据,不能使用 DISTINCT

当我在查询中使用“GROUP_CONCAT”和“HAVING”时如何计算 MySQL 结果?