Mysql 查询,每个列具有不同类别的子查询

标签 mysql sql pivot-table

表格:

CREATE TABLE category (
idcategory INT, 
category VARCHAR(50));

CREATE TABLE themes (
idtheme INT, 
idcategory INT, 
theme VARCHAR(50));

n 个类别。对于本例,假设为 6。 每个类别有 18 个主题。不多也不少。

我想做一个查询,显示数据库中每个类别的主题,例如:

+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+
|   CATEGORY 1        |   CATEGORY 2        |   CATEGORY 3        |   CATEGORY 4        |   CATEGORY 5        |   CATEGORY 6        |
+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+
|   CAT1 - THEME 1    |   CAT2 - THEME 1    |   CAT3 - THEME 1    |   CAT4 - THEME 1    |   CAT5 - THEME 1    |   CAT6 - THEME 1    |
|   CAT1 - THEME 2    |   CAT2 - THEME 2    |   CAT3 - THEME 2    |   CAT4 - THEME 2    |   CAT5 - THEME 2    |   CAT6 - THEME 2    |
|   CAT1 - THEME 3    |   CAT2 - THEME 3    |   CAT3 - THEME 3    |   CAT4 - THEME 3    |   CAT5 - THEME 3    |   CAT6 - THEME 3    |
|   CAT1 - THEME 4    |   CAT2 - THEME 4    |   CAT3 - THEME 4    |   CAT4 - THEME 4    |   CAT5 - THEME 4    |   CAT6 - THEME 4    |
|   CAT1 - THEME 5    |   CAT2 - THEME 5    |   CAT3 - THEME 5    |   CAT4 - THEME 5    |   CAT5 - THEME 5    |   CAT6 - THEME 5    |
|   CAT1 - THEME 6    |   CAT2 - THEME 6    |   CAT3 - THEME 6    |   CAT4 - THEME 6    |   CAT5 - THEME 6    |   CAT6 - THEME 6    |
|   CAT1 - THEME 7    |   CAT2 - THEME 7    |   CAT3 - THEME 7    |   CAT4 - THEME 7    |   CAT5 - THEME 7    |   CAT6 - THEME 7    |
|   CAT1 - THEME 8    |   CAT2 - THEME 8    |   CAT3 - THEME 8    |   CAT4 - THEME 8    |   CAT5 - THEME 8    |   CAT6 - THEME 8    |
|   CAT1 - THEME 9    |   CAT2 - THEME 9    |   CAT3 - THEME 9    |   CAT4 - THEME 9    |   CAT5 - THEME 9    |   CAT6 - THEME 9    |
|   CAT1 - THEME 10   |   CAT2 - THEME 10   |   CAT3 - THEME 10   |   CAT4 - THEME 10   |   CAT5 - THEME 10   |   CAT6 - THEME 10   |
|   CAT1 - THEME 11   |   CAT2 - THEME 11   |   CAT3 - THEME 11   |   CAT4 - THEME 11   |   CAT5 - THEME 11   |   CAT6 - THEME 11   |
|   CAT1 - THEME 12   |   CAT2 - THEME 12   |   CAT3 - THEME 12   |   CAT4 - THEME 12   |   CAT5 - THEME 12   |   CAT6 - THEME 12   |
|   CAT1 - THEME 13   |   CAT2 - THEME 13   |   CAT3 - THEME 13   |   CAT4 - THEME 13   |   CAT5 - THEME 13   |   CAT6 - THEME 13   |
|   CAT1 - THEME 14   |   CAT2 - THEME 14   |   CAT3 - THEME 14   |   CAT4 - THEME 14   |   CAT5 - THEME 14   |   CAT6 - THEME 14   |
|   CAT1 - THEME 15   |   CAT2 - THEME 15   |   CAT3 - THEME 15   |   CAT4 - THEME 15   |   CAT5 - THEME 15   |   CAT6 - THEME 15   |
|   CAT1 - THEME 16   |   CAT2 - THEME 16   |   CAT3 - THEME 16   |   CAT4 - THEME 16   |   CAT5 - THEME 16   |   CAT6 - THEME 16   |
|   CAT1 - THEME 17   |   CAT2 - THEME 17   |   CAT3 - THEME 17   |   CAT4 - THEME 17   |   CAT5 - THEME 17   |   CAT6 - THEME 17   |
|   CAT1 - THEME 18   |   CAT2 - THEME 18   |   CAT3 - THEME 18   |   CAT4 - THEME 18   |   CAT5 - THEME 18   |   CAT6 - THEME 18   |
+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+

因此,每一列都是一个类别,行是不同的主题。 每个类别都是相互独立的,主题也是如此,除了属于同一类别的主题之外。

我已经为此苦苦挣扎了几个小时。也许我老了或者精疲力尽了。

关于如何处理这个查询有什么想法吗?

最佳答案

如果您确切知道自己有哪些类别,则可以使用条件聚合:

select max(case when categoryid = 1 then theme end) as cat1,
       max(case when categoryid = 2 then theme end) as cat2,
       . . .
from (select th.*,
             row_number() over (partition by th.idcategory order by th.idtheme) as seqnum
      from themes th
     ) th
group by seqnum;

对结果集中所需的每一列重复该逻辑。

关于Mysql 查询,每个列具有不同类别的子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59332297/

相关文章:

mysql - 带有嵌套选择的sql插入语句

python - 旋转整数数据帧时的浮点值(pandas - python)

MySQL:组值

php - 使用空格分割发布的文本并插入到mysql数据库中

mysql - 大量 CSV 到 MySQL 的导入问题

python - Keyerror 多索引数据框 pandas

python-3.x - 如何使用多个列值对 pandas 数据框进行数据透视表/数据透视表

c# - 如何使用 EF6/MySQL 获取列名称

android - 卸载使用 PhoneGap 构建的应用程序时,android 会删除应用程序 SQL 数据库吗?

java - 关于混合 Java 和 SQL 查询,如何做得最好?