2013-05-31 3 views
0

У меня есть простой форум на моем сайте, который почти идеален. Так близко, но еще до сих пор ...Выберите 2 colums вместе максимум 1

Следующая SQL используется для создания вида спереди странице форума, где пользователи могут просматривать темы и резюме, который ответив:

SELECT COUNT(forumtopics.forumtopicline) AS totalthreads 
    , forumtopicline 
    , forumtopics.whenadded    AS threaddate 
    , forumtopics.whoadded    AS author 
    , forumtopics.title 
    , COUNT(forumreply.forumtopic)  AS replies 
    , MAX(forumreply.whenadded)   AS replydate 
    , forumreply.whoadded    AS replier 
FROM forumtopics 
    LEFT JOIN forumreply ON forumtopicline = forumreply.forumtopic 
WHERE forumtopics.topic LIKE '%%' 
    OR forumtopics.title LIKE '%%' 
    OR forumreply.reply LIKE '%%' 
GROUP BY forumtopicline 
ORDER BY 
    CASE 
     WHEN COUNT(forumreply.forumtopic) > 0 THEN MAX(forumreply.whenadded) 
     WHEN COUNT(forumreply.forumtopic) = 0 
      OR forumreply.forumtopic IS NULL THEN MAX(forumtopics.whenadded) 
    END 
    DESC 
LIMIT 0 , 30 

ли работа почти идеально. Это дает мне дату начала потока, автора потока и дату последнего ответа, и он правильно оценивает их, когда сообщение имеет самый последний ответ в верхней части.

Проблема с

MAX(forumreply.whenadded) AS replydate, forumreply.whoadded AS replier 

Это возвращает дату последнего сообщения в теме, но имя первого отвечающего независимо от даты. Я уверен, что должен быть способ завершить этот довольно элегантный SQL, чтобы избежать манипуляций на уровне приложений. Любая помощь с благодарностью получила. Скорее очевидно, мне нужен forumreply.whoadded, чтобы быть из того же ряда, что и MAX (forumreply.whenadded)

DB = Mysql. Схема:

CREATE TABLE forumtopics (
    forumtopicline  SERIAL 
    ,title    VARCHAR(256) 
    ,topic    TEXT 
    ,whenadded   DATETIME 
    ,whoadded   VARBINARY(128) 
    ,whenaltered  DATETIME 
    ,whoaltered   VARBINARY(128) 
    ,inuse    BOOL 
); 

CREATE TABLE forumreply (
    forumreplyline  SERIAL 
    ,forumtopic   BIGINT 
    ,reply    TEXT 
    ,whenadded   DATETIME 
    ,whoadded   VARBINARY(128) 
    ,whenaltered  DATETIME 
    ,whoaltered   VARBINARY(128) 
    ,inuse    BOOL 
); 

ответ

1

Попробуйте это:

SELECT 
    totalthreads, 
    forumtopicline, 
    threaddate, 
    author, 
    title, 
    replies, 
    replydate, 
    (
     SELECT 
      fr.whoadded 
     FROM 
      forumreply fr 
     WHERE 
      fr.forumtopic = forumtopicline 
      AND fr.reply LIKE '%%' 
      AND fr.whenadded = replydate 
    ) as replier 
FROM (
    SELECT COUNT(forumtopics.forumtopicline) AS totalthreads 
     , forumtopicline 
     , forumtopics.whenadded    AS threaddate 
     , forumtopics.whoadded    AS author 
     , forumtopics.title 
     , COUNT(forumreply.forumtopic)  AS replies 
     , MAX(forumreply.whenadded)   AS replydate 
     , forumreply.whoadded    AS replier 
    FROM forumtopics 
     LEFT JOIN forumreply ON forumtopicline = forumreply.forumtopic 
    WHERE forumtopics.topic LIKE '%%' 
     OR forumtopics.title LIKE '%%' 
     OR forumreply.reply LIKE '%%' 
    GROUP BY forumtopicline 
    ORDER BY 
     CASE 
      WHEN COUNT(forumreply.forumtopic) > 0 THEN MAX(forumreply.whenadded) 
      WHEN COUNT(forumreply.forumtopic) = 0 
       OR forumreply.forumtopic IS NULL THEN MAX(forumtopics.whenadded) 
     END 
     DESC 
) as tmp 
+0

Высокий. Это работает отлично. Огромное спасибо. Для тех, кто хочет использовать сам SQL, размещение текста поиска между «%%» позволит форуму также иметь функцию поиска. –

+0

точно :) рад, что я мог помочь :) cheers mate – Stephan

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