您还可以轻松地将 GROUP_CONCAT 与 SUBSTRING_INDEX 一起使用,例如:
SELECT p.*, t.name
, SUBSTRING_INDEX(t.attribs, ',', 1) as attribute1
, SUBSTRING_INDEX( SUBSTRING_INDEX(t.attribs, ',', 2), ',' , -1) as attribute2
, SUBSTRING_INDEX( SUBSTRING_INDEX(t.attribs, ',', 3), ',' , -1) as attribute3
, SUBSTRING_INDEX( SUBSTRING_INDEX(t.attribs, ',', 4), ',' , -1) as attribute4
FROM people p
LEFT JOIN (
SELECT uid, name , CONCAT(GROUP_CONCAT(attribute),',,,,') as attribs FROM attributes GROUP BY name
) as t ON t.uid = p.uid;
样本
MariaDB [bernd]> select * from people;
+----+------+
| id | uid |
+----+------+
| 1 | 1 |
| 2 | 2 |
+----+------+
2 rows in set (0.00 sec)
MariaDB [bernd]> select * from attributes;
+----+------+------+-----------+
| id | uid | name | attribute |
+----+------+------+-----------+
| 1 | 1 | Ken | Tall |
| 2 | 1 | Ken | Slender |
| 3 | 1 | Ken | Blonde |
| 4 | 2 | John | Short |
+----+------+------+-----------+
4 rows in set (0.00 sec)
MariaDB [bernd]> SELECT p.*, t.name
-> , SUBSTRING_INDEX(t.attribs, ',', 1) as attribute1
-> , SUBSTRING_INDEX( SUBSTRING_INDEX(t.attribs, ',', 2), ',' , -1) as attribute2
-> , SUBSTRING_INDEX( SUBSTRING_INDEX(t.attribs, ',', 3), ',' , -1) as attribute3
-> , SUBSTRING_INDEX( SUBSTRING_INDEX(t.attribs, ',', 4), ',' , -1) as attribute4
-> FROM people p
-> LEFT JOIN (
-> SELECT uid, name , CONCAT(GROUP_CONCAT(attribute),',,,,') as attribs FROM attributes GROUP BY name
-> ) as t ON t.uid = p.uid;
+----+------+------+------------+------------+------------+------------+
| id | uid | name | attribute1 | attribute2 | attribute3 | attribute4 |
+----+------+------+------------+------------+------------+------------+
| 1 | 1 | Ken | Tall | Slender | Blonde | |
| 2 | 2 | John | Short | | | |
+----+------+------+------------+------------+------------+------------+
2 rows in set (0.01 sec)
MariaDB [bernd]>