PHP & Mysql - левое внешнее соединение двух таблиц - PullRequest
0 голосов
/ 24 ноября 2010

У меня есть две таблицы, называемые «события» и «темы», каждая таблица может иметь много комментариев.

Что мне нужно сделать, это перечислить все события и темы с количеством комментариев для каждой строки.Мне удалось вернуть все темы, что прекрасно работает, но я не знаю, как добавить таблицу событий в MySql.Поля таблицы комментариев и событий перечислены ниже.Кто-нибудь может мне помочь с этим запросом?

События:

  • ID
  • Event_Name

Комментарии:

  • post_id <- указанный идентификатор таблицы событий или тем </li>
  • таблица <- таблица, к которой относится строка, либо темы, либо события </p>

    SELECT 
      t.id, t.title, c.created_at, 
      IF(ISNULL(c.allComments), 0, c.allComments) AS totalComments
    FROM topics AS t
    LEFT OUTER JOIN (
        SELECT created_at, post_id, COUNT(*) AS allComments 
        FROM comments
        GROUP BY post_id
    ) AS c ON c.post_id = t.id
    ORDER BY tc.created_at DESC, c.allComments DESC
    

Ответы [ 4 ]

1 голос
/ 24 ноября 2010

Похоже, что события и темы должны быть в одной таблице.

Тем не менее, я думаю, что мы можем сделать это с СОЮЗОМ. Надеюсь, у событий и тем есть одинаковые столбцы? (Или хотя бы те же важные?)

(SELECT c.table as event_or_topic, e.*, count(C.table), MAX(C.created_at) as latest_c
FROM events E LEFT JOIN comments C on (C.post_id = E.id)
WHERE C.table = 'Events' 
GROUP BY C.post_id)
UNION
(SELECT c.table as event_or_topic, t.id*, count(C.table), MAX(C.created_at) as latest_c
FROM topics T LEFT JOIN comments C on (C.post_id = E.id)
WHERE C.table = 'Topics' 
GROUP BY C.post_id)
ORDER BY latest_c

Обратите внимание, что ORDER BY применяется ко всему UNION, а не к отдельным SELECT.

Использование LEFT JOIN должно позволить тем строкам без комментариев все еще показываться. Я думаю, проблема в том, что у нас есть части нашего выбора, зависящие от комментариев (то есть - C.table, упорядочивание по последнему комментарию и т. Д.). Счет должен быть в порядке - будет просто нулем, если нет комментариев.

Возможно, вам придется немного изменить часть SELECT. Я хотел бы показать C.table, чтобы вы знали, является ли строка темой или событием, но я боюсь, что это может исказить счет. Вам нужно что-нибудь из комментариев, кроме подсчета? В вашем запросе вы используете столбцы, отличные от post_id и table, которые не указали в своем вопросе.

У вас все еще есть столбцы, я не знаю, какие они есть, например, ZoneTable для комментариев

0 голосов
/ 25 ноября 2010

У меня это работает. Если кто-нибудь знает, как лучше и эффективнее это сделать, то, пожалуйста, дайте мне знать:

(SELECT t.id, t.title, tc.dateCreated AS commentDate, 
IF(ISNULL(tc.allComments), 0, tc.allComments) AS totalComments,
t.LastActive as dateChanged
    FROM Events AS t
    LEFT OUTER JOIN (
          SELECT MAX(created_at) AS dateCreated, post_id,
          COUNT(*) AS allComments 
          FROM comments
          GROUP BY post_id
          ) AS tc ON tc.post_id = t.id)
UNION
(SELECT t.id, t.title, tc.dateCreated AS commentDate, 
IF(ISNULL(tc.allComments), 0, tc.allComments) AS totalComments,
t.LastActive as dateChanged 
    FROM topics AS t
    LEFT OUTER JOIN (
          SELECT MAX(created_at) AS dateCreated, post_id,
          COUNT(*) AS allComments 
          FROM comments
          GROUP BY post_id
          ) AS tc ON tc.post_id = t.id)
ORDER BY commentDate DESC, dateChanged DESC, totalComments DESC
0 голосов
/ 24 ноября 2010

Если я понимаю ваш вопрос, у вас есть 3 таблицы:

-События

-Topics

-Комментарии

Если это правда, что-то вроде этого должно извлечь все данные:

SELECT *
FROM events,topics
LEFT JOIN comments ON post_ID = ID
ORDER BY date DESC

Надеюсь, я на верном пути!

W.

0 голосов
/ 24 ноября 2010

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

SELECT t.id, t.title, c.created_at, COUNT(c.allComments) AS totalComments FROM topics AS t LEFT JOIN comments c ON t.id=c.post_id GROUP BY t.id ORDER BY tc.created_at DESC, c.allComments DESC

...