Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
筛选mysql pivot查询,而不丢失所选记录的筛选字段_Mysql_Sql - Fatal编程技术网

筛选mysql pivot查询,而不丢失所选记录的筛选字段

筛选mysql pivot查询,而不丢失所选记录的筛选字段,mysql,sql,Mysql,Sql,我有一个数据透视表,可以将乐谱标题链接到部件列表(特定乐器的音乐) 例如,一首歌曲可能有主吉他、键盘和鼓,正如您所期望的那样,pivot表中有两个指向相应歌曲部分的歌曲条目 我有一个查询,它将一首歌的所有部分名称连接到一个字段中 所以你会在一个领域里得到“主打吉他、键盘、鼓” 以下是查询: select songs.title, group_concat(distinct songpart.partName separator ', ') as parts from

我有一个数据透视表,可以将乐谱标题链接到部件列表(特定乐器的音乐)

例如,一首歌曲可能有主吉他、键盘和鼓,正如您所期望的那样,pivot表中有两个指向相应歌曲部分的歌曲条目

我有一个查询,它将一首歌的所有部分名称连接到一个字段中 所以你会在一个领域里得到“主打吉他、键盘、鼓”

以下是查询:

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语句的工作方式吗?是的,子查询将减慢此查询的速度