Мне нужно весить, сколько активности было в блоге WordPress. Скажем, в какой-то день есть 3 сообщения и 10 комментариев, баллы, присуждаемые за сообщение, составляют 10 и всего 1 за комментарий, а затем у этого дня было 40 очков. Тем не менее, может быть несколько дней без активности сообщений или без активности комментариев.
Моя первая идея была простой LEFT JOIN
из сообщений в таблицу комментариев. Однако это исключает дни без сообщений. Я не гуру MySQL, но я занимаюсь исследованиями, и кажется, что лучший способ решить эту проблему – это FULL OUTER JOIN
( пояснил Джефф Атвуд ), но MySQL этого не поддерживает!
Тогда на самом деле это обходной путь , но он не работает для меня. Кажется, что RIGHT OUTER JOIN
не возвращает то, что мне нужно.
Вот LEFT
, он работает очень хорошо.
SELECT DISTINCT DATE(post_date) AS day, COUNT(ID) AS post_total, COUNT(comment_ID) as comment_total, (COUNT(ID)*10 + COUNT(comment_ID)*1) AS total FROM wp_posts LEFT OUTER JOIN wp_comments ON DATE(post_date) = DATE(comment_date) GROUP BY day ORDER BY total DESC
Но что-то не так с RIGHT
.
SELECT DISTINCT DATE(post_date) AS day, COUNT(ID) AS post_total, COUNT(comment_ID) as comment_total, (COUNT(ID)*10 + COUNT(comment_ID)*1) AS total FROM wp_posts RIGHT OUTER JOIN wp_comments ON DATE(post_date) = DATE(comment_date) GROUP BY day ORDER BY total DESC
Следовательно, обходное решение UNION
бесполезно.
Что я делаю не так? Есть ли более простой способ сделать это?
Благодарю.
Примечание. Вам нужно будет добавить несколько сообщений и комментариев в разные даты.
Я думаю, что это не лучший запрос, который вы можете написать, но, похоже, работает
CREATE VIEW commentsCount (date, counter) AS SELECT DISTINCT DATE(comment_date) AS date, IFNULL(COUNT(comment_ID),0) AS total FROM wp_comments GROUP BY date ORDER BY total DESC
CREATE VIEW postsCount (date, counter) AS SELECT DISTINCT DATE(post_date) AS date, IFNULL(COUNT(ID),0) AS total FROM wp_posts GROUP BY date ORDER BY total DESC
SELECT postsCount.date, IFNULL(postsCount.counter,0), IFNULL(commentsCount.counter,0), (IFNULL(postsCount.counter,0)*10 + IFNULL(commentsCount.counter, 0)) FROM commentsCount RIGHT JOIN postsCount ON DATE(postsCount.date) = DATE(commentsCount.date) GROUP BY postsCount.date union SELECT commentsCount.date, IFNULL(postsCount.counter,0), IFNULL(commentsCount.counter,0), (IFNULL(postsCount.counter,0)*10 + IFNULL(commentsCount.counter, 0)) FROM commentsCount LEFT JOIN postsCount ON DATE(postsCount.date) = DATE(commentsCount.date) GROUP BY commentsCount.date