|
|
|
| Добрый день!
Есть запрос на выборку из таблицы пользователей (members) с двойным включением таблицы отчётов (reports).
Первый раз таблица отчётов включается для выборки количества отчётов, присланных пользователем за последние 7 дней (m_stats_ttl_reports_last_week), второй раз она подключается для выборки количества непроверенных отчётов у пользователя (m_unapproved_reports_cnt ).
Запрос работает, но проблема в том, что данные в колонках о количестве отчётов за последние 7 дней и о количестве непроверенных отчётов не отображают реальную картину. Больее того - цифры в этих двух колонках получаются одинаковые и всегда больше реальных цифр.
В чём может быть проблема?
Спасибо!
SELECT m.mid,
m.m_full_name,
COUNT( ur.r_id ) AS m_unapproved_reports_cnt,
COUNT( r.r_id ) AS m_stats_ttl_reports_last_week
FROM members m
LEFT JOIN reports r
ON ( m.mid = r.r_mid AND r.r_date_submitted >1323499747 )
LEFT JOIN reports ur
ON ( m.mid = ur.r_mid AND ur.r_approved =0 )
WHERE m.mid=1
GROUP BY m.mid
|
| |
|
|
|
|
|
|
|
для: DDK
(17.12.2011 в 11:16)
| | А можно подробнее узнать как формируется вот это условие?
r.r_date_submitted >1323499747
|
| |
|
|
|
|
|
|
|
для: cheops
(17.12.2011 в 23:23)
| | Очень просто :) при добавлении отчёта в БД в поле r_date_submitted записывается time(). Далее при составлении вышеуказанного запроса условие генерируется по принципу r_date_submitted > time() - 60*60*24*7. То есть выбираем все отчёты, у которых временной штамп попадает в период последней недели. В текущем запросе цифру я взял просто как пример. На самом деле она генерируется динамически, конечно же. | |
|
|
|
|
|
|
|
для: DDK
(17.12.2011 в 11:16)
| | На форуме SQL.ru подсказали, где ошибка! Правда я так и не понял, почему так :)
Правильный запрос:
SELECT m.mid,
m.m_full_name,
COUNT( DISTINCT ur.r_id ) AS m_unapproved_reports_cnt,
COUNT( DISTINCT r.r_id ) AS m_stats_ttl_reports_last_week
FROM members m
LEFT JOIN reports r
ON ( m.mid = r.r_mid AND r.r_date_submitted >1323499747 )
LEFT JOIN reports ur
ON ( m.mid = ur.r_mid AND ur.r_approved =0 )
WHERE m.mid=1
GROUP BY m.mid
|
Т.е. надо:
COUNT( DISTINCT ur.r_id ) AS m_unapproved_reports_cnt,
COUNT( DISTINCT r.r_id ) AS m_stats_ttl_reports_last_week | |
|
|
|
|
|
|
|
для: DDK
(18.12.2011 в 12:15)
| | Потому, что у вас декартово произведение, с LEFT JOIN, т.е. получаются дубли, от них нужно избавиться при помощи DISTINCT. | |
|
|
|