如何在一个SQL查询中检索值,名称和组名称

时间:2019-01-03 18:30:09

标签: mysql sql database-design entity-attribute-value

在MySQl 5.7中,我曾经有一个带有4个表的EAV shema:

  1. 文章
  2. 商品属性
  3. 属性名称
  4. 属性组名称

在陷入巨大的复杂性之后,我从another question获悉,这不是一个好方法。因此,我摆脱了表2所存储的所有属性,并按照STI模型的建议将它们与value或value_ids一起直接保存到表1中。

现在我得到了3张桌子:

  1. 文章
  2. 属性名称
  3. 属性组名称

起初看起来它使我的工作变得更轻松,但是当尝试替换一个简单的查询(该查询获取特定文章的所有属性组名称和属性名称)时,我发现这也不理想。

我之前的查询如下:

SELECT 
    cag.name_de, 
    cag.attr_group_id, 
    attr.attr_de, 
    attr.attr_id 
FROM 
    articles_attr aa, 
    cat_attr attr, 
    cat_attr_groups cag 
WHERE 
    aa.article_id = '181206' 
    AND aa.attr_id = attr.attr_id 
    AND cag.attr_group_id = attr.attr_group_id

现在有了新的架构,我至少需要这个:

获取所有组名,例如“颜色”

SELECT 
    name_de,
    attr_group_id 
FROM 
    cat_attr_groups

获取所有具有ID的间接值,例如“绿色”

SELECT 
    attr.attr_group_id, 
    attr.attr_de
FROM 
    articles a, 
    cat_attr attr
WHERE 
    a.article_id = '181206' 
    AND (
            (a.dial_c_id = attr.attr_id)
        OR  (a.dial_n_id = attr.attr_id)
        OR  (a.bracelet_color_id = attr.attr_id)
    )

// pseudo code
$attr[$row->attr_group_id] = $row->attr_de;

获取所有直接值:

SELECT 
    jewels,
    vibrations
FROM 
    articles a
WHERE 
    a.article_id = '181206' 


// pseudo code
$attr[4] = $row->jewels;

使用组ID映射组名称

foreach($attr AS $key => $value){
    // somehow
}

这似乎不是很优雅。我该如何更好地设计Shema,或者如何重写这些查询以在可接受的查询时间内检索值?

0 个答案:

没有答案