如何 select 仅来自相关表的唯一值
how to select only unique values from related tables
我有三个table:
id | name
----+------
1 | a
2 | b
3 | c
4 | d
branch_1
id | parent_id | b1_name
----+-----------+---------
1 | 1 | aaa
2 | 1 | bbb
3 | 1 | ccc
4 | 2 | ddd
5 | 2 | eee
6 | 2 | fff
7 | 2 | ggg
8 | 2 | hhh
branch_2
id | b2_name | parent_id
----+---------+-----------
1 | b2_aa | 1
2 | b2_ba | 2
3 | b2_bb | 2
4 | b2_bc | 2
我想将这些 table 与唯一值组合起来。我试过这段代码:
select p.id, b1.b1_name, b2.b2_name
from parent p
left outer join lateral (select distinct b1.b1_name from branch_1 b1 where b1.parent_id=p.id order by b1.b1_name) as b1 on true
left outer join lateral (select distinct b2.b2_name from branch_2 b2 where b2.parent_id=p.id order by b2.b2_name) as b2 on true
但结果有重复值:
id | b1_name | b2_name
----+---------+---------
1 | aaa | b2_aa
1 | bbb | b2_aa
1 | ccc | b2_aa
2 | ddd | b2_ba
2 | ddd | b2_bb
2 | ddd | b2_bc
2 | eee | b2_ba
2 | eee | b2_bb
2 | eee | b2_bc
2 | fff | b2_ba
2 | fff | b2_bb
2 | fff | b2_bc
2 | ggg | b2_ba
2 | ggg | b2_bb
2 | ggg | b2_bc
2 | hhh | b2_ba
2 | hhh | b2_bb
2 | hhh | b2_bc
我想得到:
id | b1_name | b2_name
----+---------+---------
1 | aaa | b2_aa
1 | bbb | ---
1 | ccc | ---
2 | ddd | b2_ba
2 | eee | b2_bb
2 | fff | b2_bc
2 | ggg | ---
2 | hhh | ---
也许这看起来很奇怪,但我只需要没有重复的唯一值。那么我如何才能唯一值呢?
P.S。我需要这样一个 table 用于在 sphinx 上进行分面搜索,以便正确考虑产品数量,并提出这样的要求:
select * from facetIndex facet b1_name, b2_name
我想知道 Sphinxes 多值属性是否适用于此。唉,它们只是整数。所以可以将分支表 ID 放入 MVA(而不是名称)
如果 PostgreSQL 有 group_concat
也许可以
sql_query = SEELCT p.id,
GROUP_CONCAT(DISTINCT b1.id) as b1,
GROUP_CONCAT(DISTINCT b2.id) as b2
FROM parent p
LEFT JOIN branch1 b1 ON (b1.parent = p.id)
LEFT JOIN branch2 b2 ON (b2.parent = p.id)
GROUP BY p.id
但不是吗?
...所以使用 sql_attr_multi
能力 运行 分离查询。
sql_query = SELECT id, name FROM parent
sql_attr_multi = uint b1 from query; SELECT parent_id, id FROM branch1
sql_attr_multi = uint b2 from query; SELECT parent_id, id FROM branch2
'joining' 完全在狮身人面像中。
然后就可以在MVA上进行切面,eg SphinxQL查询
select * from facetIndex facet b1 facet b2
您可以使用 window 函数仅对第一行进行外连接:
select t.id, t.b1_name, b2.b2_name
from (
select p.id, b1.b1_name, row_number() over (partition by p.id order by b1_name) as rn
from parent p
join branch_1 b1 on b1.parent_id = p.id
) t
left join (
select parent_id, b2_name,
row_number() over (partition by parent_id) as rn
from branch_2
) b2 on b2.parent_id = t.id and b2.rn = t.rn
order by t.id;
我有三个table:
id | name
----+------
1 | a
2 | b
3 | c
4 | d
branch_1
id | parent_id | b1_name
----+-----------+---------
1 | 1 | aaa
2 | 1 | bbb
3 | 1 | ccc
4 | 2 | ddd
5 | 2 | eee
6 | 2 | fff
7 | 2 | ggg
8 | 2 | hhh
branch_2
id | b2_name | parent_id
----+---------+-----------
1 | b2_aa | 1
2 | b2_ba | 2
3 | b2_bb | 2
4 | b2_bc | 2
我想将这些 table 与唯一值组合起来。我试过这段代码:
select p.id, b1.b1_name, b2.b2_name
from parent p
left outer join lateral (select distinct b1.b1_name from branch_1 b1 where b1.parent_id=p.id order by b1.b1_name) as b1 on true
left outer join lateral (select distinct b2.b2_name from branch_2 b2 where b2.parent_id=p.id order by b2.b2_name) as b2 on true
但结果有重复值:
id | b1_name | b2_name
----+---------+---------
1 | aaa | b2_aa
1 | bbb | b2_aa
1 | ccc | b2_aa
2 | ddd | b2_ba
2 | ddd | b2_bb
2 | ddd | b2_bc
2 | eee | b2_ba
2 | eee | b2_bb
2 | eee | b2_bc
2 | fff | b2_ba
2 | fff | b2_bb
2 | fff | b2_bc
2 | ggg | b2_ba
2 | ggg | b2_bb
2 | ggg | b2_bc
2 | hhh | b2_ba
2 | hhh | b2_bb
2 | hhh | b2_bc
我想得到:
id | b1_name | b2_name
----+---------+---------
1 | aaa | b2_aa
1 | bbb | ---
1 | ccc | ---
2 | ddd | b2_ba
2 | eee | b2_bb
2 | fff | b2_bc
2 | ggg | ---
2 | hhh | ---
也许这看起来很奇怪,但我只需要没有重复的唯一值。那么我如何才能唯一值呢?
P.S。我需要这样一个 table 用于在 sphinx 上进行分面搜索,以便正确考虑产品数量,并提出这样的要求:
select * from facetIndex facet b1_name, b2_name
我想知道 Sphinxes 多值属性是否适用于此。唉,它们只是整数。所以可以将分支表 ID 放入 MVA(而不是名称)
如果 PostgreSQL 有 group_concat
也许可以
sql_query = SEELCT p.id,
GROUP_CONCAT(DISTINCT b1.id) as b1,
GROUP_CONCAT(DISTINCT b2.id) as b2
FROM parent p
LEFT JOIN branch1 b1 ON (b1.parent = p.id)
LEFT JOIN branch2 b2 ON (b2.parent = p.id)
GROUP BY p.id
但不是吗?
...所以使用 sql_attr_multi
能力 运行 分离查询。
sql_query = SELECT id, name FROM parent
sql_attr_multi = uint b1 from query; SELECT parent_id, id FROM branch1
sql_attr_multi = uint b2 from query; SELECT parent_id, id FROM branch2
'joining' 完全在狮身人面像中。
然后就可以在MVA上进行切面,eg SphinxQL查询
select * from facetIndex facet b1 facet b2
您可以使用 window 函数仅对第一行进行外连接:
select t.id, t.b1_name, b2.b2_name
from (
select p.id, b1.b1_name, row_number() over (partition by p.id order by b1_name) as rn
from parent p
join branch_1 b1 on b1.parent_id = p.id
) t
left join (
select parent_id, b2_name,
row_number() over (partition by parent_id) as rn
from branch_2
) b2 on b2.parent_id = t.id and b2.rn = t.rn
order by t.id;