查询EAV数据库会产生太多" null" s

时间:2017-06-15 12:13:50

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

我已经尝试了几天来为所述Entity-Attribute-Value数据库生成查询,并且我对sql有点生疏,所以即使经过大量研究我也无法获得查询完全按照我的意愿去做。

表格的重要部分如下所示:

ID | concept | modifier
 1 | abc:10  | @
 2 | abc:22  | @
 2 | abc:22  | t:f
 2 | abc:78  | @
 2 | abc:78  | t:x
 3 | kfg:12  | @
 4 | aqx:23  | @
 5 | abc:49  | @
 5 | abc:49  | t:f
 5 | abc:49  | t:g

我想要一张这样的表:

ID | concept | mod_f | mod_other
 1 | abc:10  | null  | null
 2 | abc:22  | t:f   | null
 2 | abc:78  | null  | t:x
 5 | abc:49  | t:f   | t:g

我的尝试让我已经得到了这个结果:

ID | concept | mod_f | mod_other
 1 | abc:10  | null  | null
 2 | abc:22  | t:f   | null
 2 | abc:22  | null  | null
 2 | abc:78  | null  | t:x
 2 | abc:78  | null  | null
 5 | abc:49  | t:f   | null
 5 | abc:49  | t:f   | t:g
 5 | abc:49  | null  | t:g
 5 | abc:49  | null  | null

以下是产生我的结果的代码:

    SELECT  t.ID, t.concept, t.modifier,
        case when t.concept LIKE 'abc:%' and t.modifier = '@' then t.concept end AS "concept",
        case when t2.modifier = 't:f' then t2.modifier end AS "mod_f",
        case when t3.modifier LIKE 't:%' then t3.modifier end AS "mod_other"
    FROM    table as t
    LEFT JOIN table as t2 ON t.ID = t2.ID and t.concept = t2.concept
    LEFT JOIN table as t3 ON t2.ID = t3.ID and t2.concept = t3.concept
    WHERE   t.concept LIKE 'abc:%' and t.modifier = '@' and 
        (t2.modifier LIKE 't:f' or t2.modifier ='@')and 
        (t3.modifier = 't:g' or t3.modifier = 't:x' or t3.modifier ='@')
ORDER by t.ID asc;

修复看起来很简单,但无论我尝试过什么都会使结果减少到我想要的程度(基本上删除太多行),此时我不知道我需要搜索什么

" case"查询中的一部分看起来是一种肮脏的解决方案,我找到了某个地方并使用了因为它有效(使" @"进入" null"),所以如果你有任何建议为了使查询更加干净,请随时回复。

1 个答案:

答案 0 :(得分:0)

好的,我找到了答案,这比我想象的要容易。

GROUP by就是答案。我认为这不适用于文本,但您实际上可以使用 max 聚合text-case select语句,如下所示:

    SELECT  t.ID, t.concept, t.modifier,
        max(case when t.concept LIKE 'abc:%' and t.modifier = '@' then t.concept end) AS "concept",
        max(case when t2.modifier = 't:f' then t2.modifier end) AS "mod_f",
        max(case when t3.modifier LIKE 't:%' then t3.modifier end) AS "mod_other"
    FROM    table as t
    LEFT JOIN table as t2 ON t.ID = t2.ID and t.concept = t2.concept
    LEFT JOIN table as t3 ON t2.ID = t3.ID and t2.concept = t3.concept
    WHERE   t.concept LIKE 'abc:%' and t.modifier = '@' and 
        (t2.modifier LIKE 't:f' or t2.modifier ='@')and 
        (t3.modifier = 't:g' or t3.modifier = 't:x' or t3.modifier ='@')
    GROUP by t.ID, t.concept, t.modifier
    ORDER by t.ID asc;

这让我完全找到了我正在寻找的桌子。但这只能起作用,因为 mod_other 每个概念只能包含1个代码。