2016-09-30 2 views
0

Следующий запрос mysql выведет столбец имен пользователей и серию из 5 столбцов после каждого имени пользователя, которые являются результатом 5 подсчетов.SUM подсчетов для динамических таблиц как столбцов MYSQL

SELECT f.username, 
(SELECT COUNT(id) FROM sites s WHERE s.username = f.username) site_count, 
(SELECT COUNT(id) FROM banners b WHERE b.username = f.username) banner_count, 
(SELECT COUNT(id) FROM favorites fa WHERE fa.username = f.username) favorite_count, 
(SELECT COUNT(id) FROM social_posts so WHERE so.username = f.username) social_count, 
(SELECT COUNT(id) FROM stream_updates st WHERE st.username = f.username) stream_count 
FROM members f 
    WHERE f.username 
     IN (SELECT friend2 as username FROM list_friends WHERE friend1 = :user 
     AND friend2 <> :user) 
    OR f.username 
     IN (SELECT friend1 as username FROM list_friends WHERE friend2 = :user 
    AND friend1 <> :user) 
    OR f.username = :user 

Пример ВЫВОД:

| username | site_count | banner_count | favorite_count | social_count | stream_count | 
+----------+------------+--------------+----------------+--------------+--------------+ 
| user1 |  7  |  12  |  3  |  5  |  11  | 
| user2 |  2  |  1  |  12  |  1  |  0  | 
| user3 |  5  |  7  |  4  |  9  |  25  | 

Что я надеюсь добиться для исхода сумма каждой строки:

| username | site_count | banner_count | favorite_count | social_count | stream_count | 
+----------+------------+--------------+----------------+--------------+--------------+ 
|   | 14  |  20  |  19  |  15  |  36  | 

ответ

0

Моего решения было использовано определенным пользователем переменным: = так что переменное будет обновляться с каждой суммой.

Для получения более подробной информации читайте: http://dev.mysql.com/doc/refman/5.7/en/user-variables.html

Конечный результат обновленного запроса выглядит следующим образом:

SELECT f.username, 
@sites := SUM((SELECT COUNT(*) FROM sites s WHERE s.username = f.username)) AS site_count, 
@banner := SUM((SELECT COUNT(*) FROM banners b WHERE b.username = f.username)) AS banner_count, 
@favs := SUM((SELECT COUNT(*) FROM favorites fa WHERE fa.username = f.username)) AS favorite_count, 
@social := SUM((SELECT COUNT(*) FROM social_posts so WHERE so.username = f.username)) AS social_count, 
@stream := SUM((SELECT COUNT(*) FROM stream_updates st WHERE st.username = f.username)) AS stream_count 
    FROM members f 
    WHERE f.username 
    IN (SELECT friend2 as username FROM list_friends WHERE friend1 = :user 
    AND friend2 <> :user) 
    OR f.username 
    IN (SELECT friend1 as username FROM list_friends WHERE friend2 = :user 
    AND friend1 <> :user) 
    OR f.username = :user 
0

просто добавить сумму рассчитывать?

SELECT f.username, 
    SUM((SELECT COUNT(id) FROM sites s WHERE s.username = f.username)) site_count, 
    SUM((SELECT COUNT(id) FROM banners b WHERE b.username = f.username)) banner_count, 
    SUM((SELECT COUNT(id) FROM favorites fa WHERE fa.username = f.username)) favorite_count, 
    SUM((SELECT COUNT(id) FROM social_posts so WHERE so.username = f.username)) social_count, 
    SUM((SELECT COUNT(id) FROM stream_updates st WHERE st.username = f.username)) stream_count 
FROM members f 
WHERE f.username 
    IN (SELECT friend2 as username FROM list_friends WHERE friend1 = :user 
    AND friend2 <> :user) 
OR f.username 
    IN (SELECT friend1 as username FROM list_friends WHERE friend2 = :user 
AND friend1 <> :user) 
OR f.username = :user 

если нужны отсчеты каждого пользователя, просто добавить Group By f.username до конца

+0

К сожалению, просто обернув их в SUM не будет сокращать это, я бы это было так просто. Это займет сумму каждого счета для каждого пользователя, что бесполезно. Например, если счетчик возвращает 5 для user1, делая сумму 5, не изменит результат. Кроме того, группа не будет работать, так как имя_файла и имя пользователя из инструкции IN не совпадают и не могут быть сгруппированы как таковые. Я попытался сделать группу по имени f.username, также попробовал группу по имени пользователя, и все это не изменилось. – Bruce

+0

ok, тогда .. может быть простой способ сделать это, посчитать их из sql.if использовать php просто посчитать их в php –

+0

Это может быть на самом деле способ пойти, но я надеюсь на решение на основе sql, поскольку я должен сделать соединение в любом случае для данных, и все данные индексируются, поэтому я хотел бы сделать это в mysql, если это возможно. :) – Bruce

Смежные вопросы