mysql - MySQL 5.7:按左连接的一对多表排序
问题描述
数据库
mysql> DESCRIBE filtercategories;
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(16) | NO | | NULL | |
| position | tinyint(4) | NO | | NULL | |
+----------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
mysql> DESCRIBE tags;
+---------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| slug | varchar(64) | NO | UNI | NULL | |
| name | varchar(128) | NO | | NULL | |
| color | varchar(7) | NO | | NULL | |
| visible | tinyint(1) | NO | | 0 | |
+---------+--------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)
mysql> DESCRIBE filtercategories_tags;
+-------------------+------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------------+------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| filtercategory_id | int(11) | NO | MUL | NULL | |
| tag_id | int(11) | NO | MUL | NULL | |
| position | tinyint(4) | NO | | NULL | |
+-------------------+------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
目标
要返回按位置filtercategories
排序的列表,左连接标签也应按位置排序。
到目前为止,尝试像:
SELECT
fc.*,
GROUP_CONCAT(t.name) AS tagNames
FROM filtercategories fc
LEFT JOIN (filtercategories_tags fc_t, tags t)
ON (
fc_t.filtercategory_id = fc.id AND
t.id = fc_t.tag_id
)
GROUP BY fc.id
ORDER BY fc.position
问题是 MySQL 不允许使用ORDER BY fc_t.position
:
ER_WRONG_FIELD_WITH_GROUP:ORDER BY 子句的表达式#1 不在 GROUP BY 子句中,并且包含在功能上不依赖于 GROUP BY 子句中的列的非聚合列“foo_db.fc_t.position”;这与 sql_mode=only_full_group_by 不兼容
解决方案
左连接的标签也应该按位置排序。
然后你应该ORDER BY
在 : 中使用一个子句GROUP_CONCAT()
:
SELECT
fc.*,
GROUP_CONCAT(t.name ORDER BY fc_t.position) AS tagNames
FROM filtercategories fc
LEFT JOIN filtercategories_tags fc_t ON fc_t.filtercategory_id = fc.id
LEFT JOIN tags t ON t.id = fc_t.tag_id
GROUP BY fc.id
ORDER BY fc.position
我还修复了您的 JOIN 语法。请不要在一个查询中将显式 JOIN 与逗号连接混合。这很难理解和调试。
推荐阅读
- javascript - D3.js 使用 d3.create 元素无法在 svg 标签中显示
- reactjs - 我正在学习反应,我的代码运行良好,但我如何才能一次性声明 currDate 以在全局范围内使用它以在 useState 中使用
- django - 查询具有 OneToOne 用户关系的员工考勤列表时出错
- flutter - 如何将 CSS LinearGradient 转换为 Flutter LinearGradient?
- reactjs - 开玩笑,酶,无法读取未定义的属性“地图”
- php - php数组显示数组元素每行4个
- database-design - MS ACCESS:在主题表单上,我如何才能突出显示所需的控件,如果且仅当用户错过它(抛出错误)
- http - Grafana 简单 json 数据源的反向代理的正确配置
- python - 我们可以在本地机器上设置 live django 项目吗
- angular - 添加新行后角度垫表不刷新