2012-05-24 5 views
0

Мой вопрос: Как получить разные значения в одном запросе sql? Я пытаюсь это:SQL select внутри внутренних соединений

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» (т.е. показывает мне идентификатор, название вопроса, сумма общего рейтинга голосов, а число голосов .. ..

Но я хочу, чтобы показать невидимые комментарии также, что еще одно поля в этой таблице и принимает «1» для невидимого (непрочитанного) комментария ...

Так как я могу сделать это, поставив невидимые комментарии номер .... любая идея или предложения ...

+1

вы удалили поле q_id из вашего подзапроса с именем «tab», поэтому, конечно, вы больше не можете присоединиться к этому полю. Вероятно, вы захотите '(выберите sum (p.unseen), p.q_id из вопросов_опций в качестве p-группы по q_id) tab' –

+0

привет .... да, вы правы .. он показывает некоторый результат ... но 2 для всех полей , я хочу только для тех полей, которые не читают комментарии ... спасибо –

ответ

2

Думаю, судья Ментал прав.

Вы должны выбрать поле «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)

..so в основном соотношение (и соединение) между вашими двумя таблицами на основе questions.id и questions_options.q_id ,

Ну, это та же самая история для вашего подзапроса.

В вашем подзапросе вы определяете инструкцию SELECT FROM «questions_options», , которая возвращает только столбцы/поля, которые вы ставите после своего выбора.

(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 вы выбрали в вашем подзапрос.

+0

да отлично работает ..., выбрав поле q_id в подзапросе .... а затем innerjoin на tab.q_id ... спасибо joshua.Но я не понимал, как это работает, вы можете объяснить это или изменить свой вопрос для деталей ... спасибо. –

1

Я не знаю, правильно ли я, но я нашел что-то здесь.
Если вы снова и снова читаете запрос OP, U узнает, что нет необходимости в втором внутреннем соединении.
Вы также можете поставить sum(p.unseen) as comments в первую очередь select, так как он также просит от questions_options таблицы на основе q.id = tab.q_id , which by itself comes in the first inner join between вопросов and questions_options`.
Надеюсь, он вам поможет.

+0

вы правы, Abhinav, но для этого сценария есть другая вещь ... bcz мы поставили некоторый рейтинг вопроса в option_value, а также добавили комментарии к комментариям ... поэтому поэтому он не может выполнить то, что вы говорите. ... –

Смежные вопросы