2012-01-14 3 views
3

сегодня мне нужна ваша помощь, чтобы получить конкретный запрос выбора sql.конкретный запрос выбора mysql

У меня есть следующая таблица:

table with all results

и после конкретного запроса в отношении конкретного идентификатора (в данном случае идентификатор 1) Я хочу иметь результат:

user_id (псевдоним для id_sender/id_recipient), дата (может быть, не более функции, потому что я хочу иметь последнюю дату в группу), сообщения (отсчет функция сообщений):

10 | 2012-01-14 09:10:05 | 4 
11 | 2012-01-13 13:52:49 | 1 
13 | 2012-01-13 20:01:17 | 1 
14 | 2012-01-14 09:20:17 | 1 

я судимый много но не получить точные результаты - так что мой подход был что-то вроде этого:

SELECT `id_recipient`, `id_sender`, MAX(`date`) AS `date`, COUNT(*) AS `messages` FROM `table` WHERE `id_recipient` = 1 OR `id_sender` = 1 GROUP BY `id_recipient`, `id_sender` 

, но затем я получаю этот результат:

my approach

его не так уж и плохо, но как u может видеть, что 4-я строка должна быть включена в результаты первого. Надеюсь, у меня есть. не стесняйтесь спрашивать, не ясно ли что-то.

спасибо заранее, поздравления

ответ

7

Итак, так как мы знаем значение для id_recipient, мы можем использовать некоторые математику, чтобы обмануть SQL в получив этот неприятный запрос.

Пусть n - значение идентификатора представляющего интерес лица.

Мы знаем, что соединение id_recipient и id_sender ВСЕГДА включает пользователя с идентификатором n. На основе предложения where.

Следовательно, id_recipient + id_sender == n + id_otherPerson является истинным.

Результирующий запрос будет очень похож на этот. (Это было некоторое время, но я не думаю, что у меня есть какие-либо проблемы синтаксиса)

SELECT (`id_recipient` + `id_sender` - n) AS `id_otherPerson`, 
     MAX(`date`) AS `date`, COUNT(*) AS `messages` 
FROM `table` 
WHERE `id_recipient` = n XOR `id_sender` = n 
GROUP BY `id_otherPerson`; 

Edit: Я изменил его на XOR, поэтому, если человек п сообщения человека п, он не будет вызывать все значения, которые должны быть увеличены на количество раз n, перепутали себя.

+0

1 + 10 - 1 = 10 и 10 + 1 - 1 = 10 – JustinDanielson

+0

черт, никогда не думал о чем-то вроде этого - действительно хороший способ справиться с такой проблемой - я буду помнить об этом и для подобных проблем! – user1104419

+0

Завершилась ли работа? – JustinDanielson

0

Что об этом?

SELECT user_id, MAX(date), COUNT(*) 
FROM (
    SELECT id_recipient AS 'user_id', date 
    FROM table 
    WHERE id_recipient <> 1 AND id_sender = 1 
    UNION 
    SELECT id_sender AS 'user_id', date 
    FROM table 
    WHERE id_recipient = 1 AND id_sender <> 1 
) AS tbl 
GROUP BY user_id 

Предполагается, что вы хотите использовать id_recipient если id_sender является 1 и id_sender если id_recipient равен 1.

0

Я считаю, что вывод, который вы хотите должна быть ниже

10 | 2012-01-13 20:01:17 | 3 
11 | 2012-01-13 13:52:49 | 1 
13 | 2012-01-13 20:01:17 | 1 

Я говорю, как вы смешиваете id_recipient и id_sender

+1

Он хочет сгруппировать любое сообщение между 1 и 10. Независимо от того, является ли 1 отправителем или получателем. 14 следует включить, поскольку 14 получили сообщение от 1. – JustinDanielson

+0

okay ... позвольте мне проверить ... –

+0

justinDanielson прав - я хочу собирать все сообщения между двумя пользователями, а не только отправленные или полученные. – user1104419

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