2013-07-22 3 views
3

У меня есть таблица MySQL private_messages (pm), который выглядит следующим образом:разницы между двумя причинами

идентификатора пользователя --- отправитель --- текст

Хотя Userid и Sender оба идентификаторы из таблицы user. Теперь я хочу сделать запрос, когда пользователь получает разницу между количеством pms, которое он отправил другому пользователю, и полученными pms из этого, сгруппированным по Userid Итак, я хочу поместить эти два запроса в один и получить разные из него:

SELECT count(*) AS s_count, sender FROM pm WHERE userid=".$userid" GROUP BY sender 
SELECT count(*) AS u_count, userid FROM pm WHERE sender=".$userid." GROUP BY userid 

и теперь я хочу разницу между s_count и u_count на всех соответствующих UserIds.

+0

Почему вы хотите использовать группу, если вы используете счетчик * –

+0

http://stackoverflow.com/questions/5462961/how-to-combine-two-count-queries-to-their-ratio?lq= 1 –

ответ

3

Если вы хотите статистику для каждого пользователя вы переписывался, вы можете просто собрать все сообщения, используя UNION ALL и просуммировать их во внешнем запросе;

SELECT counterpart, SUM(sent) sent, SUM(received) received, 
     SUM(sent) - SUM(received) difference 
FROM (
    SELECT 1 sent, 0 received, userid counterpart 
    FROM messages WHERE sender = <your user id> 
    UNION ALL 
    SELECT 0 sent, 1 received, sender counterpart 
    FROM messages WHERE userid = <your user id> 
) a 
GROUP BY counterpart; 

An SQLfiddle to test with.

+0

спасибо, это работает отлично! И не могли бы вы рассказать мне, как я бы добавил предложение where-where, поэтому он выбирает строки, где разница> 0? –

+1

@TobiasBaumeister. Вы можете просто добавить 'HAVING SUM (отправлено) <> СУММ (полученное)' в конец запроса после строки 'GROUP BY'. –

1

Вы бы целесообразно, чтобы добавить в свой список выбора любого столбца (ов), над которым вы группировать результаты:

SELECT sender, COUNT(*) AS s_count FROM pm WHERE userid = ? GROUP BY sender 
SELECT userid, COUNT(*) AS u_count FROM pm WHERE sender = ? GROUP BY userid 

вы увидите, что первый запрос возвращает количество сообщений с с учетом userid, разбивка по sender; тогда как второй запрос возвращает количество сообщений с данным sender, разбитым на userid. Таким образом, нет смысла комбинировать эти запросы «и получить от этого разницу».

0

Вы можете сделать что-то вроде этого:

SELECT 
    (SELECT count(*) FROM pm WHERE userid=".$userid" GROUP BY sender) AS s_count, 
    (SELECT count(*) FROM pm WHERE sender=".$userid." GROUP BY userid) AS u_count, 
    (SELECT s_count - u_count) AS result 
Смежные вопросы