所以我有3个名为comments
,users
和posts
的表。
我想得到
通过在c.post_id = p.id上的评论和帖子之间进行左联接,从帖子表中获取“标签”。
但是这里有一个技巧,标签应该基于帖子的类型(p.post_type_id)。
因此,如果id = 1那么这意味着我们将“问题”作为帖子并简单地检索标签
否则,如果id = 2那么这意味着我们有一个答案并且要获得标签我们必须从posts表中查看其parent_id。
我尝试使用WHERE,CASE,嵌套IF和嵌套SELECT,但都抛出了语法错误
最后,我尝试执行以下操作,但结果为空
SELECT c.score,
COALESCE (u.reputation) reputation,
COALESCE (p.tags) tags
FROM comments c
LEFT JOIN users u
ON c.user_id = u.id
LEFT JOIN posts p
ON (c.post_id = p.id AND p.post_type_id = 1) OR (c.post_id = p.id AND p.post_type_id = 2 )
WHERE (p.id = p.parent_id)
那么如何根据这两种类型制作标签呢?
答案 0 :(得分:1)
快速猜测:
http://sqlfiddle.com/#!9/a1cc3/1
SELECT c.score,
u.reputation reputation,
IF(p.post_type_id=1,p.tags,
IF(p.post_type_id=2,parents.tags,'UNKNOWN POST TYPE')
) tags
FROM comments c
LEFT JOIN users u
ON c.user_id = u.id
LEFT JOIN posts p
ON c.post_id = p.id
LEFT JOIN posts parents
ON parents.id = p.parent_id
更新以下是Postgres变体:
http://sqlfiddle.com/#!15/a1cc3/2
SELECT c.score,
u.reputation,
CASE p.post_type_id
WHEN 1 THEN p.tags
WHEN 2 THEN parents.tags
ELSE 'UNKNOWN POST TYPE'
END tags
FROM comments c
LEFT JOIN users u
ON c.user_id = u.id
LEFT JOIN posts p
ON c.post_id = p.id
LEFT JOIN posts parents
ON parents.id = p.parent_id