【发布时间】:2014-07-22 00:50:54
【问题描述】:
我有一个数据透视表,可以将乐谱标题链接到部分列表(特定乐器的音乐)
例如,一首歌曲可能有主音吉他、键盘和鼓,正如您所期望的那样,数据透视表有两个指向歌曲相应部分的条目...
我有一个查询,它将一首歌的所有部分名称连接到一个字段中 所以你会在一个字段中获得“主音吉他、键盘、鼓”
这里是查询:
select
songs.title,
group_concat(distinct songpart.partName separator ', ') as parts
from
songpart,
songpartpivot,
songs
where
songs.id=songpartpivot.songid and
songpartpivot.partid=songpart.id
group by
(songs.id)
这正是我想要的,但是我在过滤查询时遇到了问题,例如我可能想要所有带有鼓声部分的歌曲,只需添加
and songpartpivot.partid = ?
到 WHERE 子句确实选择了所有具有特定内容的歌曲,但是我只在连接字段中选择了(单个)部分,所以应该有
Lead Guitar, Bass Guitar, Drums
我只看到
Bass Guitar
在使用低音吉他部分选择所有歌曲时
如何在数据透视表或歌曲表的其他字段中选择值,同时仍然能够查看所选记录的所有部分...
根据要求:
mysql> describe songs;
+-------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| title | text | NO | | NULL | |
+-------+---------+------+-----+---------+----------------+
2 rows in set (0.00 sec)
mysql> describe songpartpivot;
+--------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+---------+------+-----+---------+-------+
| songid | int(11) | NO | | NULL | |
| partid | int(11) | NO | | NULL | |
+--------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> describe songpart;
+----------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------+------+-----+---------+----------------+
| id | int(11) | NO | MUL | NULL | auto_increment |
| partName | text | NO | | NULL | |
+----------+---------+------+-----+---------+----------------+
2 rows in set (0.00 sec)
【问题讨论】:
-
考虑提供适当的 DDL(和/或 sqlfiddle)以及所需的结果集。此外,不要使用隐式(逗号)连接语法。始终使用显式 JOIN 语法。这样你的问题就解决了一半。