查询 EAV 数据库生成太多 "null"s
Query for EAV database generates too many "null"s
几天来我一直在尝试为上述 Entity-Attribute-Value 数据库生成查询,但我对 sql 有点生疏,所以即使经过大量研究我也无法管理让查询完全按照我的意愿进行。
table 的重要部分如下所示:
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
我想要一个这样的table:
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"),所以如果你有任何使查询更清晰的建议,请随时回复。
好的,我找到了答案,而且比我想象的要容易。
GROUP by 就是答案。我认为这不适用于文本,但实际上您可以像这样使用 max 聚合文本大小写 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;
这正是我要找的 table。但这只有效,因为 mod_other 每个概念只能包含 1 个代码。
几天来我一直在尝试为上述 Entity-Attribute-Value 数据库生成查询,但我对 sql 有点生疏,所以即使经过大量研究我也无法管理让查询完全按照我的意愿进行。
table 的重要部分如下所示:
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
我想要一个这样的table:
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"),所以如果你有任何使查询更清晰的建议,请随时回复。
好的,我找到了答案,而且比我想象的要容易。
GROUP by 就是答案。我认为这不适用于文本,但实际上您可以像这样使用 max 聚合文本大小写 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;
这正是我要找的 table。但这只有效,因为 mod_other 每个概念只能包含 1 个代码。