Это называется декартово произведение . Когда вы объединяете таблицы вместе, по умолчанию получается каждая перестановка строк , для которых выполняются условия соединения. Вы используете JOIN
условия для ограничения этих перестановок.
Но поскольку вы объединяете несколько таблиц в users
, результат включает в себя каждую перестановку каждой соответствующей таблицы. Например, каждая совпадающая строка в points
повторяется для каждой совпадающей строки в comments
, и каждая из них снова умножается, повторяясь для соответствующей строки в rants
.
Вы можете частично компенсировать это с помощью COUNT(DISTINCT c_id)
, как вы делаете, но DISTINCT
необходим только потому, что у вас есть несколько строк на c_id
. И это не сработает, если вы не примените его к уникальным значениям. Это средство не работает для выражений SUM()
.
Обычно вы пытаетесь выполнить слишком много вычислений в одном запросе. Вам нужно разделить его на отдельные запросы, чтобы он был надежным. И тогда вы также можете избавиться от модификаторов DISTINCT
.
SELECT u.user_id, SUM(COALESCE(p.point_points, 0)) AS total_points,
SUM( CASE WHEN p.point_date > '$this_month' THEN p.point_points ELSE 0 END ) AS month_points
FROM users u LEFT JOIN points p
ON u.user_id = p.point_userid
WHERE u.user_id = $id
GROUP BY u.user_id;
SELECT user_id, COUNT(c.c_id) as num_comments,
FROM users u LEFT JOIN comments c
ON (c.c_userid = u.user_id)
WHERE u.user_id = $id
GROUP BY u.user_id;
SELECT u.user_id, COUNT(r.rant_id) as live_submissions
FROM users u LEFT JOIN rants r
ON (r.rant_poster = u.user_id AND r.rant_status = 1)
WHERE u.user_id = $id
GROUP BY u.user_id;
Вы не должны пытаться выполнить все три из них в одном запросе.