【问题标题】:How to order all values in group_concat ?如何对 group_concat 中的所有值进行排序?
【发布时间】:2018-07-04 12:34:13
【问题描述】:

查询:-

SELECT emp.emp_id AS employeeId,
       emp.emp_name AS employeeName,
       **group_concat(CASE
                          WHEN log_date = log_date THEN log_time
                          ELSE ''
                      END) AS logTimings**,
                                         shift AS shift
FROM at_hr_logs_Jan l,
     at_hr_emp employee,
     at_dates dt
WHERE user_id=00000247
  AND l.user_id=emp.emp_code
  AND emp.dept_id=1
  AND l.status_id=fn_getcodevalue_id('STS', 'ACTIVE')
  AND l.log_date=dt.att_date
GROUP BY l.log_date ;

实际输出:-

员工 ID 员工姓名 日志计时 00000247 M. Rama Rao 18:03,17:40,13:35,11:48,09:19 00000247 M. Rama Rao 15:24,09:11,18:44,16:37,15:27,15:24

但需要:

员工 ID 员工姓名 日志计时 00000247 M. Rama Rao 09:19,11:48,13:35,17:40,18:03 00000247 M. Rama Rao 09:11,15:27,15:24,15:24,16:37,18:44

【问题讨论】:

  • 你试过order by l.log_date
  • CASE WHEN log_date = log_date THEN log_time ELSE '' END 有什么意义??它永远是真的
  • 是的..我试过然后它显示 log_date order by 但它不影响内部值
  • @Ravi..CASE WHEN log_date = log_date THEN log_time order by ELSE null END..这有可能吗??
  • 请发布您的表结构和示例数据。

标签: mysql sql sql-order-by case group-concat


【解决方案1】:

注意事项:

  • 从不FROM 子句中使用逗号。始终使用正确、明确的 JOIN 语法。
  • 您正在通过log_date 进行聚合,因此group_concat() 中不需要case 表达式
  • 最佳做法是将所有非聚合列放入GROUP BY
  • 我建议在 SELECT 中也包含日期和班次。
  • at_hr_emp 的表别名是 employee(在您的代码中),但它被引用为 emp。只需使用缩写e

因此,这个查询应该写成:

SELECT e.emp_id AS employeeId, e.emp_name AS employeeName, l.log_date,
       group_concat(log_time order by log_time) as logTimings,
       shift AS shift
FROM at_hr_logs_Jan l JOIN
     at_hr_emp e
     ON l.user_id = e.emp_code JOIN
     at_dates dt
     ON l.log_date = dt.att_date
WHERE e.user_id=00000247 AND e.dept_id = 1 AND
      l.status_id = fn_getcodevalue_id('STS', 'ACTIVE')
GROUP BY e.emp_id, e.emp_name, l.log_date, shift;

【讨论】:

    【解决方案2】:

    您可以在GROUP_CONCAT 中添加ORDER BY

    我不懂WHEN log_date = log_date的逻辑,永远都是true。那么,CASE 声明就没有意义了,它不会属于 ELSE 的情况。

     group_concat(CASE WHEN log_date = log_date THEN log_time ELSE '' END)
    

    group_concat(log_time)
    

    两者都会给你相同的结果。因此,您应该进行以下更改

    group_concat(log_time ORDER BY log_time) AS logTimings
    

    【讨论】:

    • @SimhachalamSopeti 你应该阅读这个meta.stackexchange.com/a/5235。我可以看到,你从来没有接受任何答案。确保您有在发布任何问题时接受正确答案的习惯。请记住,人们会花时间来解决您的问题。
    猜你喜欢
    • 2010-11-02
    • 2022-11-22
    • 2019-08-17
    • 2018-07-18
    • 1970-01-01
    • 2015-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多