1

我的问题是:如何在一个 sql 查询中获取不同的值?我正在尝试这个:

SELECT 
          q.id,
          q.question_title,
          SUM(op.option_value) AS total_votes,
          COUNT(op.option_value) AS number_votes,
          tab.comments 
FROM
          questions_options AS op 
          INNER JOIN questions AS q 
                    ON (q.id = op.q_id) 
          INNER JOIN 
                    (SELECT 
                              SUM(p.unseen) AS comments 
                    FROM
                              questions_options AS p) tab 
                    ON (q.id = tab.q_id) 
WHERE op.option_value > 0 
GROUP BY q.question_title 

如果我删除中间的“INNER JOIN”(即显示 ID、问题标题、总票数和票数......

但我也想显示看不见的评论,这是该表中的另一个字段,对看不见的(未读)评论取“1”...

那么我怎样才能通过放置看不见的评论编号来做到这一点......任何想法或建议......

4

2 回答 2

3

我认为心理法官是对的。

您应该在子查询中选择“q_id”字段,以便能够对“tab.q_id”进行内部连接。

-解释-

你的第一个INNER JOIN看起来像这样:

SELECT * FROM questions_options AS op INNER JOIN questions AS q ON (q.id = op.q_id)

..所以基本上你的两个表之间的关系(和连接)是基于 questions.idand questions_options.q_id

好吧,对于您的子查询来说,情况也是如此。

在您的子查询中,您定义了一个 SELECT 语句 FROM "questions_options",它只会返回您在 SELECT 之后放置的列/字段。

(SELECT SUM(p.unseen) AS comments FROM questions_options AS p) tab

为了能够使用子查询中的任何数据,您必须SELECT对该 questions_options.q_id字段并与questions.id主查询中已有的字段进行连接。

(SELECT p.q_id, SUM(p.unseen) AS comments FROM questions_options AS p) tab INNER JOIN (...subquery...) ON (q.id = tab.q_id)

所以tab.q_id指的是p.q_id您在子查询中选择的。

于 2012-05-24T07:05:26.913 回答
1

我不知道我是否正确,但我在这里找到了一些东西。
如果你一次又一次地阅读 OP 的查询,你会知道不需要第二次内连接。
你也可以把它自己sum(p.unseen) as comments放在第一位select,因为它也是questions_options根据 q.id = tab.q_id , which by itself comes in the first inner join betweenquestions andquestions_options` 从表格中询问的。
希望它可以帮助你。

于 2012-05-24T07:18:49.993 回答