簡體   English   中英

MySQL 5.7:按左聯接的一對多表排序

[英]MySQL 5.7: Order by left-joined one-to-many tables

數據庫

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)

目標

要返回按position排序的filtercategories的LIST,左連接的標記也應按position排序。


到目前為止,嘗試如下:

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子句中,並且包含未聚合的列'foo_db.fc_t.position',該列在功能上不依賴於GROUP BY子句中的列; 這與sql_mode = only_full_group_by不兼容

左連接標簽也應按位置排序。

然后,您應該在GROUP_CONCAT()使用ORDER BY子句:

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與逗號聯接混合使用。 這很難理解和調試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM