SQL选择内部联接

时间:2012-05-24 06:54:13

标签: sql select inner-join

我的问题是:如何在一个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”...

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

2 个答案:

答案 0 :(得分:3)

我认为智慧法官是对的。

您应该在子查询中选择“q_id”字段,以便能够将内部联接设置为“tab.q_id”。

<强> -Explanation -

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

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

..所以基本上两个表之间的关系(和连接)基于 questions.idquestions_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

答案 1 :(得分:1)

我不知道我是否正确,但我在这里找到了一些东西 如果你一次又一次地阅读OP的查询,你就会知道不需要第二次内连接 您也可以将sum(p.unseen) as comments放在第一个select本身,因为它还会根据q.id = tab.q_id questions_options问题从, which by itself comes in the first inner join between表中提问{{1 }} questions_options`。
希望它可以帮到你。