获得嵌套选择权的问题

时间:2017-08-29 15:16:30

标签: sql postgresql select

我想生成一个查询,其中如果表中存在1个或多个记录,则一列给出一个true / false。以下是三个表和所需的输出:

表1:USER

ID | NAME  | CREATE_DATE  
1  | Chris | 01.01.2017   
2  | Mark  | 05.02.2017  

表2:ENTRY

ID | USER_ID | ENTRY_CONTENT  
1  |    1    | "Some string"   
2  |    1    | "Another string"  
3  |    2    | "something something dark side"  

表3:费率

ID1 | ID2 | WINNER  
1   |  2  |  1

表RATE中的ID1和ID2是来自ENTRY的ID。想象一下,我向您展示了用户制作的一对条目,并询问它们哪个更好。他们的选择存储在“赢家”中

我的查询应该给我以下内容:

USER ID | Amount of entries | RATINGS Y/N  

对于每个用户,我想看到他们的ID,他们做了多少条目,以及他们是否做了任何评级。

所以就上述情况而言:

USER ID | Amount of entries | RATINGS Y/N  
1       |     2             |  1  
2       |     1             |  0

以下是代码:

SELECT    u.id, 
          ( 
                 SELECT Count(*) AS count 
                 FROM   entry 
                 WHERE  ( entry.user_id = u.id)
          ) AS "Amount of entries", 
          EXISTS 
          ( 
                 SELECT id1 
                 FROM   rate r 
                 WHERE  r.id1=e.id 
                 AND    e.id=u.id) AS "Ratings Y/N" 
FROM      "user" u 
LEFT JOIN entry e on u.id=e.user_id 
GROUP BY  u.id

我收到以下错误:
错误:子查询使用来自外部查询的未分组列e.id. LiNE 5 ...来自RATE r的ID1,其中r.id1 = e.id和e ..

我是初学者,但没有找到解决此问题的方法。我将很感激解决方案和简短解释为什么它失败了以及我应该研究哪些概念。谢谢。

1 个答案:

答案 0 :(得分:1)

不清楚如何定义RATINGS Y/N,因为不确定ID1和ID2是什么或Winner结果。所以计算只是一个客人。测试它的最佳方法是使用相同的查询来测试没有聚合的JOIN,并检查结果集是否正确。

我使用user_id,entry_id作为连接字段以使其清楚。如果连接不是您想要的,那么您的意图应该很容易修复。

SELECT u.user_id,
       COUNT( e.user_id ) as total_entries,
       MAX( CASE WHEN r.winner IS NULL 
                 THEN 0
                 ELSE 1
            END) as RATINGS
FROM users u
LEFT JOIN entries e
  ON u.user_id = e.user_id
LEFT JOIN rates r
  ON e.entry_id = r.entry_id1
  OR e.entry_id = r.entry_id2
GROUP BY u.user_id