【发布时间】:2011-06-30 08:43:31
【问题描述】:
这是一个我已经困惑了很长时间的查询,我一直无法让它完全正确地工作,经过大约 40 小时的思考,我已经走到了这一步。
设置
对于示例问题,我们有 2 个表,其中一个是...
field_site_id field_sitename field_admins
1 Some Site 1,
2 Other Site 1,2,
另一个是管理员,比如......
field_user_id field_firstname field_lastname
1 Joe Bloggs
2 Barry Wills
现在所有这个查询的设计目的如下:
- 列出数据库中的所有网站
- 使用 JOIN 和 FIND_IN_SET 拉动每个管理员
- 以及 GROUP_CONCAT(field_firstname, ' ', field_lastname) 和 GROUP BY 以使用真实用户名构建字段。
- 还允许 HAVING 过滤自定义结果以进一步缩小结果范围。
这部分工作得很好。
我不知道如何实现的是按 GROUP_CONCAT 结果对结果进行排序,我想这是 ORDER BY 在 concat 函数之前工作,因此数据不存在按它排序,所以什么会是另一种选择吗?
代码示例:
SELECT *
GROUP_CONCAT(DISTINCT field_firstname, ' ', field_lastname ORDER BY field_lastname SEPARATOR ', ') AS field_admins_fullname,
FROM `table_sites`
LEFT JOIN `table_admins` ON FIND_IN_SET( `table_admins`.`field_user_id`, `table_sites`.`field_site_id` ) > 0
GROUP BY field_site_id
我还尝试了一个使用子查询来收集 group_concat 结果的查询,如下所示...
( SELECT GROUP_CONCAT(field_firstname, ' ', field_lastname ORDER BY field_lastname ASC SEPARATOR ', ') FROM table_admins
WHERE FIND_IN_SET( `table_admins`.`field_user_id`, `table_sites`.`field_admins` ) > 0
) AS field_admins_fullname
结论
尝试 ORDER BY field_admins_fullname 的任何一种方式都不会创建正确的结果,它不会出错,但假设这是因为给定的 ORDER BY 是空白的,所以它只是做它想做的任何事情。
欢迎提出任何建议,如果这是不可能的,另一种推荐索引方法是什么?
【问题讨论】:
标签: mysql sql-order-by subquery group-concat