如何 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;

在线示例:https://rextester.com/GNYF31027