2013-03-13 2 views
1

Извините за плохой вопрос, я не уверен в правильной терминологии, чтобы описать то, что я прошу.Как можно объединить эти два вопроса?

У меня есть две таблицы:

Сообщений:

p_id | p_author | p_text 

post_comments:

pc_id | pc_p_id | pc_author | pc_text 

pc_p_id для каждого комментария соответствует p_id поста.

Я хочу, чтобы выбрать:

  1. The p_id и p_text для всех сообщений от конкретного автора
  2. Количество комментариев к соответствующему сообщению

я могу сделать первый часть с таким запросом (предположим, что «1» является автором):

SELECT p_id, p_text FROM posts WHERE p_author = 1 

И я могу получить количество комментариев для конкретной должности, как это (предполагающей «12» является идентификатор сообщения):

SELECT COUNT(*) FROM post_comments WHERE pc_p_id = 12 

Мой вопрос, как я могу объединить два запроса, так что я получаю p_id и p_text для всех сообщения от конкретного автора, а также количество комментариев для соответствующих должностей?

Я попытался с помощью LEFT JOIN как следующий, но это дает мне ошибку синтаксиса:

SELECT t1.p_id, t1.p_text, t2.COUNT(*) 
FROM posts t1 LEFT JOIN post_comments t2 
WHERE t1.p_author = 1 AND t2.pc_p_id = t1.p_id 
ORDER BY t1.p_id DESC 

Вот является SQL Скрипки:

http://sqlfiddle.com/#!2/e9b975

+0

Можете ли вы поставить [скрипку] (http://sqlfiddle.com)? – hd1

+0

Как связаны две таблицы? Соответствуют ли p_author и pc_author? – Melanie

+0

@Melanie - я обновил свой вопрос. Pc_p_id для каждого комментария соответствует p_id сообщения. Нет, p_author и pc_author не эквивалентны. – Nate

ответ

1
SELECT p_id, p_text, count(1) 
FROM posts p 
    JOIN post_comments pc 
    ON p.p_id = pc.pc_p_id 
WHERE p_author = 1 
GROUP BY p_id, p_text 

Вот является отредактированная версия, которая делает встроенный выбор:

SELECT p_id, p_text, 
    (SELECT COUNT(1) FROM post_comments WHERE pc_p_id = p.p_id) AS count 
FROM posts p 
WHERE p_author = 1 

Я проверил это в скрипку

+0

Спасибо, такого рода работы, но он не возвращает сообщений без комментариев. SQL Fiddle: http://sqlfiddle.com/#!2/e9b975 – Nate

+0

просто переключитесь на LEFT OUTER JOIN – iGanja

+0

Нравится? http://sqlfiddle.com/#!2/e9b975/17. Он почти работает, но он возвращает «1» для второго сообщения, когда количество комментариев на самом деле «0». Так что что-то не работает правильно. – Nate

0

LEFT_JOIN используется, когда вы хотите, чтобы все строки из таблицы слева, но не может быть соответствующие строки в таблице справа. В противном случае вы хотите прямое (внутреннее) соединение. Кроме того, при использовании функции агрегации, такой как COUNT(), вы должны использовать предложение GROUP_BY, если у вас есть какие-либо неагрегатные столбцы.

+0

Однако в правой таблице могут быть не строки. Это похоже на блог, в котором автор может публиковать сообщение, а другие могут публиковать комментарии. Сообщение может иметь или не иметь соответствующих комментариев. – Nate

+1

Тогда левое соединение подходит, но по-прежнему требуется предложение group by. – Adrian

-1

ВЫБОР p.p_id, p.p_text, граф (pc.pc_id), как граф
из сообщений р, post_comments шт
ГДЕ pc.pc_p_id = p.p_id
И p.p_author = 1
И pc.pc_p_id = 12

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