2013-09-11 2 views
0

Я строю простую систему вопросов/ответов с использованием php и mysql.
То, что я пытаюсь сделать, это показать все вопросы, среди которых есть их ответы и отметка времени последнего ответа.
Вот структура моих таблиц:Выбор строк, объединяющих Join & Count

Table 'Discussion': 
id | title | description | user_id | timestamp 
-------------------------------------------------------------------------------- 
Table 'Reply': 
id | reply_text | user_id | discussion_id | timestamp 

Что я делаю сейчас, это выбрать обсуждения и получить ответы рассчитывать так:

SELECT 
    d.*, 
    count(dr.id) AS replies_count 
FROM discussion d 
LEFT JOIN discussion_reply dr ON d.id = dr.discussion_id 
GROUP BY d.id 

Это возвращает строки как id | title | description | user_id | timestamp | replies_count

Затем (через PHP) я просматриваю результаты и запрашиваю БД, чтобы получить ответ с самой последней (максимальной) меткой времени для каждого обсуждения.
Итак, для каждой строки, возвращаемой первым запросом, создается новый запрос.

Есть ли способ получить всю необходимую мне информацию, просто выполнив один запрос?
Как изменить свой первоначальный запрос таким образом, что он возвращает:

идентификатор | название | описание | user_id | временная метка | replies_count | latest_reply_timestamp

Спасибо заранее

ответ

1

Заявление ниже даст вам последний ответ в каждой дискуссии.

SELECT a.id, a.title, a.description, a.user_id, a.timestamp, 
     b.id ReplyID, b.reply_text, b.user_id, b.discussion_id, 
     b.timestamp ReplyTimestamp, 
     COALESCE(c.totalReplies, 0) TotalReplyCount 

FROM Discussion a 
     LEFT JOIN 
     (
      SELECT a.* 
      FROM Reply a 
        INNER JOIN 
        (
         SELECT discussion_id, MAX(timestamp) timestamp 
         FROM Reply 
         GROUP BY discussion_id 
        ) b ON a.discussion_id = b.discussion_id AND 
          a.timestamp = b.timestamp 
     ) b ON a.discussion_id = b.discussion_id 
     LEFT JOIN 
     (
      SELECT discussion_id, COUNT(*) totalReplies 
      FROM Reply 
      GROUP BY discussion_id  
     ) c ON a.discussion_id = c.discussion_id 
+0

Спасибо, что ответило @ 491243. Первые мысли здесь, похоже, не возвращают обсуждения без ответов. Он также не вычисляет количество ответов, но я думаю, что это может быть исправлено. – CrisDeBlonde

+0

см. Мой обновленный ответ. –

+0

Большое спасибо, я проверю его сейчас :) – CrisDeBlonde