【问题标题】:MySQL problem with query construction. Making columns from attributes查询构造的 MySQL 问题。从属性创建列
【发布时间】:2020-03-29 17:22:11
【问题描述】:

我已经开始使用 MySQL 数据库。我必须完成使用现有数据库中的 java 创建 XML 文件的任务。我已经完成了 XML 结构并在文档中插入了一些数据,但是我在从 db 获取数据时遇到了问题。这个问题描述如下:

products_extra_fields

products_extra_fields_id | products_extra_fields_name
-------------------------|---------------------------
           1             |       cpu
           2             |       hdd
           3             |       diagonal
           4             |       gpu

产品

products_id | products_name | products_quantity  
------------| --------------|-------------------
      1     |  product name |      123
      2     |  product name |      125
      3     |  product name |      12
      4     |  product name |      43

products_to_products_extra_fields

products_id  | products_extra_fields_id | products_extra_fields_value
-------------|--------------------------|---------------------------- 
      3      |            1             |             i7
      2      |            4             |           geforce
      2      |            1             |             i5
      3      |            3             |             15.6

查询结果应如下所示或类似:

products_id | cpu | diagonal |   gpu   | ...
------------|-----|--------- |---------|----
     3      | i7  |   15.6   | geforce | 
...
...

有没有简单的方法来获取这样的数据?我已经加入了一些表,但我的知识太差,无法进行包含上述结果的查询:

SELECT * FROM products p 
INNER JOIN products_description pd ON pd.products_id = p.products_id 
INNER JOIN products_to_categories ptc ON ptc.products_id = p.products_id 
INNER JOIN categories_description cd ON cd.categories_id = ptc.categories_id 
INNER JOIN manufacturers m ON p.manufacturers_id = m.manufacturers_id 
INNER JOIN products_availability_description pad ON pad.products_availability_id = p.products_availability_id 
INNER JOIN products_availability pa ON pa.products_availability_id = pad.products_availability_id 
WHERE p.products_quantity > 30

【问题讨论】:

    标签: java mysql sql jdbc pivot


    【解决方案1】:

    您可以使用条件聚合:

    select
        pf.products_id,
        max(case when f.products_extra_fields_name = 'cpu'      then pf.products_extra_fields_value end) cpu,
        max(case when f.products_extra_fields_name = 'diagonal' then pf.products_extra_fields_value end) diagonal,
        max(case when f.products_extra_fields_name = 'gpu'      then pf.products_extra_fields_value end) gpu
    from products_to_products_extra_fields pf
    inner join products_extra_fields f 
        on e.products_extra_fields_id  = pf.products_extra_fields_id 
    group by pf.products_id
    

    注意,对于这个结果,你不需要带products 表;如果您需要该表中的列(如产品名称),您可以多带一个join

    无关注意:你不应该把表名放在列名中;这需要更多的输入,使查询更加冗长,并且不会添加太多有价值的信息(使用表标识符,我们已经知道哪个列来自哪个表)。

    【讨论】:

      猜你喜欢
      • 2016-12-20
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 2014-08-21
      • 1970-01-01
      • 2012-11-10
      • 2021-11-08
      相关资源
      最近更新 更多