简体   繁体   English

联接和左联接同一个表

[英]join and left join same table

i have tables: 我有桌子:

ppls ppls

pid | name
----+-----
 1  | test1
 2  | test2

cats

cid | cname | cval
----+-------+-----
 1  | cat1  | ctest1-1
 2  | cat2  | ctest1-2
 3  | cat1  | ctest2-1
 4  | cat2  | ctest2-2

ppls_cats ppls_cats

pid | cid 
----+----
  1 | 1
  1 | 2
  2 | 3
  2 | 4

i need result: 我需要结果:

name  |   cat1   |   cat2 
------+----------+---------
test1 | ctest1-1 | ctest1-2
test2 | ctest2-1 | ctest2-2

query: 查询:

select name, c1.cval as cat1, c2.cval as cat2 from ppls p
join ppls_cats pc on p.pid=pc.pid
left join cats c1 on pc.cid=c1.cid and c1.cname='cat1'
left join cats c2 on pc.cid=c2.cid and c2.cname='cat2'

not work properly. 无法正常工作。 how to fix? 怎么修?

ps: http://sqlfiddle.com/#!9/f0ec5/1 ps: http ://sqlfiddle.com/#!9 / f0ec5 / 1

Try this: 尝试这个:

SELECT t1.name, 
       MAX(CASE WHEN t3.cname = 'cat1' THEN cval END) AS cat1,
       MAX(CASE WHEN t3.cname = 'cat2' THEN cval END) AS cat2
FROM ppls AS t1
LEFT JOIN ppls_cats AS t2 ON t1.pid = t2.pid
LEFT JOIN cats AS t3 ON t2.cid = t3.cid
GROUP BY t1.pid, t1.name

So, you get at the result you want using conditional aggregation and a single join operation to the cats table. 因此,使用条件聚合和对cats表的单个联接操作即可获得所需的结果。

Demo here 在这里演示

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM