确保加入时来自一个表的记录始终覆盖其他表

红巨人

这是一个小提琴的例子

我想将五个EAV表组合成一个存储所有产品属性的大表。假设有两部手机,A并且B来自同一系列,称为Nokia 1150这两款手机共享一些相同的信息,例如价格,品牌,内存。该系列使用绿色塑料盒。但是B手机是特别版。它的外壳是金色的,是黑色的。我想透视表并使用IFNULLcoalesce确保该表model_attr始终被覆盖series_attr

我希望输出是这样的:

MODEL_NAME  SERIES_NAME     PRICE   RAM BRAND   MATERIAL    COLOR
A           Nokia Series    5000    512 Nokia   Plastic     Green
B           Nokia Series    5000    512 Nokia   Gold        Black

我的代码:

Select m.model_name,s.series_name,s.price,s.ram,s.brand,
    GROUP_CONCAT(
     IF(a.attr_name = 'material',a.attr_value, NULL)) AS material,
    GROUP_CONCAT(
     IF(a.attr_name = 'color',a.attr_value, NULL)) AS color
FROM model m INNER JOIN series s 
LEFT JOIN series_attr sa ON sa.series_id = s.series_id
LEFT JOIN model_attr ma ON ma.model_id = m.model_id
LEFT JOIN attr a ON a.attr_id = ma.attr_id
GROUP BY m.model_name

我得到的是:

MODEL_NAME  SERIES_NAME     PRICE   RAM BRAND   MATERIAL    COLOR
A           Nokia Series    5000    512 Nokia   (null)  (null)
B           Nokia Series    5000    512 Nokia   Gold,Gold,Gold,Gold Black,Black,Black,Black

表架构

 CREATE TABLE series
        (`series_id` int, `series_name` varchar(20),`price` int,`ram`int,`brand`varchar(20))
    ;

INSERT INTO series
    (`series_id`,`series_name`,`price`,`ram`,`brand`)
VALUES
    (1,'Nokia Series',5000,512,'Nokia'),
    (2,'Sony Series',2500,1024,'Sony')

;

CREATE TABLE model
    (`model_id` int, `model_name` varchar(20),`series_id` int)
;

INSERT INTO model
    (`model_id`,`model_name`,`series_id`)
VALUES
    (1,'A',1),
    (2, 'B',1),
    (3, 'C',2)
;

CREATE TABLE attr
    (`attr_id` int, `attr_name` varchar(20),`attr_value` varchar(20))
;

INSERT INTO attr
    (`attr_id`,`attr_name`,`attr_value`)
VALUES
    (1, 'material','Gold'),
    (2, 'material','Plastic'),
    (3, 'color','Grey'),
    (4, 'color','Black'),
    (5, 'color','Green')


;

CREATE TABLE series_attr
    (`series_id` int, `attr_id` int )
;
INSERT INTO series_attr
    (`series_id`,`attr_id`)
VALUES
    (1,2),
    (1,5),
    (2,2),
    (2,3)
;



CREATE TABLE model_attr
    (`model_id` int, `attr_id` int,`series_group`int )
;
INSERT INTO model_attr
    (`model_id`,`attr_id`,`series_group`)
VALUES
    (2,1,1),
    (2,4,1)
;

我在table中创建了一个名为series_group的字段model_attr我希望这会使加入变得容易。任何帮助将不胜感激

戈登·利诺夫

您实际上完成了大部分工作。但是,关键的更改是两次加入属性表,一次用于系列,一次用于模型。然后,您可以分别查看每个属性,然后选择模型(如果存在)或系列:

Select m.model_name, s.series_name, s.price, s.ram, s.brand,
       (case when sum(a.attr_name = 'material') > 0
             then GROUP_CONCAT(DISTINCT IF(a.attr_name = 'material', a.attr_value, NULL))
             else GROUP_CONCAT(DISTINCT IF(saa.attr_name = 'material', saa.attr_value, NULL))
        end) AS material,
       (case when sum(a.attr_name = 'color') > 0
             then GROUP_CONCAT(DISTINCT IF(a.attr_name = 'color', a.attr_value, NULL))
             else GROUP_CONCAT(DISTINCT IF(saa.attr_name = 'color', saa.attr_value, NULL))
        end) AS color
FROM model m INNER JOIN
     series s
     on m.series_id = s.series_id LEFT JOIN
     series_attr sa
     ON sa.series_id = s.series_id LEFT JOIN
     attr saa
     on saa.attr_id = sa.attr_id LEFT JOIN
     model_attr ma
     ON ma.model_id = m.model_id LEFT JOIN
     attr a
     ON a.attr_id = ma.attr_id
GROUP BY m.model_name;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Java根据其他表中的记录显示一个表中的记录

来自分类Dev

根据来自其他两个表的数据更新一个表

来自分类Dev

根据来自其他两个表的数据更新一个表

来自分类Dev

创建一个用其他表中的记录计数填充的表

来自分类Dev

如何从一个表中选择不应存在其他记录的记录

来自分类Dev

基于多个条件获取一个表中的记录但不提取其他表中的记录

来自分类Dev

当其他表中的日期比今天更旧时更新列(完成)+ 在其他表中插入新行,ID 来自第一个表

来自分类Dev

加入时更改一个表中的行值以匹配另一表中的行值

来自分类Dev

SQL Server 2014 - 想要加入,但记录可能不在一个表或另一个表上

来自分类Dev

使用PDO插入时来自另一个表的ID

来自分类Dev

创建搜索过滤器,并且其中一个字段来自其他表

来自分类Dev

如何加入 SQL Server 中的多个列并在一个表中包含其他表中不存在的列?

来自分类Dev

将记录插入到表中,其中一个来自另一表

来自分类Dev

自己加入一个MySQL表

来自分类Dev

加入同一个表

来自分类Dev

sqlite3仅当其他4个列匹配时才使用来自另一个表的数据更新表

来自分类Dev

如何根据来自另一个表的信息在表中插入新记录?

来自分类Dev

选择一个表并加入2个不同的表

来自分类Dev

用来自另一个的信息填充表(可能通过加入)

来自分类Dev

创建表并在SSMS中添加来自其他2个表的2条记录的乘法

来自分类Dev

SQL Server:如何加入记录不在另一个表中?

来自分类Dev

使用另一个表中的 ID 加入和更新 MySQL 记录?

来自分类Dev

通过加入不在另一个表中的三个表来获取记录

来自分类Dev

mysql查询加入,比较两个表并返回第一个表中的所有记录

来自分类Dev

填写其他输入时,禁用一个输入

来自分类Dev

如何确保一个表只有一个记录,每个Customer_Number的Is_Deleted = 0?

来自分类Dev

通过ID将一个表与其他两个表联接

来自分类Dev

与其他表一起创建一个新表

来自分类Dev

通过匹配其他列将某个表的某个列中的某些记录替换为另一个表

Related 相关文章

  1. 1

    Java根据其他表中的记录显示一个表中的记录

  2. 2

    根据来自其他两个表的数据更新一个表

  3. 3

    根据来自其他两个表的数据更新一个表

  4. 4

    创建一个用其他表中的记录计数填充的表

  5. 5

    如何从一个表中选择不应存在其他记录的记录

  6. 6

    基于多个条件获取一个表中的记录但不提取其他表中的记录

  7. 7

    当其他表中的日期比今天更旧时更新列(完成)+ 在其他表中插入新行,ID 来自第一个表

  8. 8

    加入时更改一个表中的行值以匹配另一表中的行值

  9. 9

    SQL Server 2014 - 想要加入,但记录可能不在一个表或另一个表上

  10. 10

    使用PDO插入时来自另一个表的ID

  11. 11

    创建搜索过滤器,并且其中一个字段来自其他表

  12. 12

    如何加入 SQL Server 中的多个列并在一个表中包含其他表中不存在的列?

  13. 13

    将记录插入到表中,其中一个来自另一表

  14. 14

    自己加入一个MySQL表

  15. 15

    加入同一个表

  16. 16

    sqlite3仅当其他4个列匹配时才使用来自另一个表的数据更新表

  17. 17

    如何根据来自另一个表的信息在表中插入新记录?

  18. 18

    选择一个表并加入2个不同的表

  19. 19

    用来自另一个的信息填充表(可能通过加入)

  20. 20

    创建表并在SSMS中添加来自其他2个表的2条记录的乘法

  21. 21

    SQL Server:如何加入记录不在另一个表中?

  22. 22

    使用另一个表中的 ID 加入和更新 MySQL 记录?

  23. 23

    通过加入不在另一个表中的三个表来获取记录

  24. 24

    mysql查询加入,比较两个表并返回第一个表中的所有记录

  25. 25

    填写其他输入时,禁用一个输入

  26. 26

    如何确保一个表只有一个记录,每个Customer_Number的Is_Deleted = 0?

  27. 27

    通过ID将一个表与其他两个表联接

  28. 28

    与其他表一起创建一个新表

  29. 29

    通过匹配其他列将某个表的某个列中的某些记录替换为另一个表

热门标签

归档