筛选mysql pivot查询,而不丢失所选记录的筛选字段
我有一个数据透视表,可以将乐谱标题链接到部件列表(特定乐器的音乐) 例如,一首歌曲可能有主吉他、键盘和鼓,正如您所期望的那样,pivot表中有两个指向相应歌曲部分的歌曲条目 我有一个查询,它将一首歌的所有部分名称连接到一个字段中 所以你会在一个领域里得到“主打吉他、键盘、鼓” 以下是查询:筛选mysql pivot查询,而不丢失所选记录的筛选字段,mysql,sql,Mysql,Sql,我有一个数据透视表,可以将乐谱标题链接到部件列表(特定乐器的音乐) 例如,一首歌曲可能有主吉他、键盘和鼓,正如您所期望的那样,pivot表中有两个指向相应歌曲部分的歌曲条目 我有一个查询,它将一首歌的所有部分名称连接到一个字段中 所以你会在一个领域里得到“主打吉他、键盘、鼓” 以下是查询: select songs.title, group_concat(distinct songpart.partName separator ', ') as parts from
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子句,它确实为所有具有特定内容的歌曲进行了选择,但是我只为连接字段中的部分选择了(单曲),因此应该是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的情况下很难想象,但是这个约束可能会取代您尝试使用的约束:
and songs.id in ( select songid from songpart where songpart.partid=?)
您可能需要聚合后过滤
group by
(songs.id)
having SUM(songpartpivot.partid = ?)>0
考虑将适当的DDL(和/或SqLFIDLE)与期望的结果集一起提供。另外,不要使用隐式(逗号-)连接语法。始终使用显式连接语法。然后你一半的问题就解决了。两个有效的答案-接受。。。你能解释一下为什么SUM以及为什么查询没有它就不能识别字段吗?have用于过滤分组数据。因此它选择了所有包含partid=?的组。但是为什么SUM?-为什么SUM“看到”partyid中没有的部分?最终接受了这一个,因为它是最容易找到不同部分的组合的,例如,有一些和没有另一个SUM…好吧,总结每个组中partyid值为x的所有实例。两个可行的答案-接受哪一个。。。您的解决方案是否因为子查询而变慢了?您能稍微扩展一下IN语句的工作方式吗?是的,子查询将减慢此查询的速度