【问题标题】:filter a mysql pivot query without losing filtered fields for selected records过滤 mysql 数据透视查询而不丢失选定记录的过滤字段
【发布时间】: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 语法。这样你的问题就解决了一半。

标签: mysql sql


【解决方案1】:

您可能需要聚合后过滤

group by 
    (songs.id)
having SUM(songpartpivot.partid = ?)>0

【讨论】:

  • 两个可行的答案 - 接受哪个...你能解释为什么 SUM 以及为什么没有它查询无法识别该字段吗?
  • HAVING 用于过滤分组数据。因此它会选择所有包含partid=?的组。
  • 但为什么是 SUM ? - 为什么 SUM 会“看到”partid 而没有?
  • 最终接受了这个,因为它最容易找到不同的部件组合,例如有一些和没有另一个
  • SUM ...很好地总结了每个组的所有实例,其中存在值为 x 的 partyid。
【解决方案2】:

没有看到 DDL 就很难想象,但也许这个约束可以代替您尝试使用的约束:

and songs.id in ( select songid from songpart where songpart.partid=?)

【讨论】:

  • 两个可行的答案-接受哪个...由于子查询,您的解决方案是否会以某种方式变慢?您能详细介绍一下 IN 语句的工作原理吗?
  • 是的,子查询会减慢查询速度
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-17
  • 2021-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-10
相关资源
最近更新 更多