Использование INNER JOIN для получения скрещенных данных по диапазону дат - PullRequest
3 голосов
/ 01 марта 2011

У меня есть тематическая галерея. В панели инструментов я должен отобразить самые просматриваемые темы по дате (сегодня, последние 7 дней, последние 30 дней, все время).

Это две вовлеченные таблицы:

  1. Тема
    • id_theme
    • название
  2. вид
    • id_view
    • id_theme
    • дата

Значения $ timestamp рассчитываются с помощью mktime () (без проблем).

Это мой текущий запрос SQL:

 SELECT t.id_theme,t.title,
        (SELECT COUNT(*)
        FROM views
        WHERE views.id_theme=t.id_theme
        AND views.date BETWEEN '.$timestamp1.' AND '.$timestamp2.')
 AS q
 FROM theme AS t
 INNER JOIN views ON t.id_theme = views.id_theme
 GROUP BY views.id_theme
 ORDER BY q 
 DESC LIMIT 10

Проблема в том, что подвох заключается в том, что иногда он получает темы с 0 просмотрами, и этого не должно происходить. Я попытался изменить INNER JOIN с помощью RIGHT JOIN безрезультатно. Есть идеи?

Ответы [ 2 ]

1 голос
/ 01 марта 2011

Хм.не уверен, почему вы используете подзапросы для этого, похоже, это будет работать лучше:

SELECT theme.id_theme, theme.title, COUNT(views.id_view) as view_count
FROM theme
LEFT JOIN views ON (theme.id_theme = views.id_theme)
GROUP BY theme.id_theme
WHERE views.date > DATE_SUB(now() INTERVAL 30 day)
ORDER BY view_count DESC
HAVING view_count > 0
0 голосов
/ 01 марта 2011
 SELECT t.id_theme, t.title, COUNT(*) AS q
 FROM theme AS t
 INNER JOIN views ON t.id_theme = views.id_theme 
    AND views.date BETWEEN '.$timestamp1.' AND '.$timestamp2.'
 GROUP BY t.id_theme, t.title
 ORDER BY q 
 DESC LIMIT 10
...