SQL Group по комбинации? - PullRequest
       5

SQL Group по комбинации?

1 голос
/ 28 февраля 2011

У меня проблемы с выбором элементов из таблицы, где device_id может быть либо в столбце from_device_id, либо в столбце to_device_id.Я пытаюсь вернуть все чаты, в которых идентификатор устройства указан в столбцах from_device_id или to_device_id, но вернуть только последнее сообщение.

select chat.*, (select screen_name from usr where chat.from_device_id=usr.device_id limit 1) as from_screen_name, (select screen_name from usr where chat.to_device_id=usr.device_id limit 1) as to_screen_name from chat where to_device_id="ffffffff-af28-3427-a2bc-83865900edbe" or from_device_id="ffffffff-af28-3427-a2bc-83865900edbe" group by from_device_id, to_device_id;

+----+--------------------------------------+--------------------------------------+---------+---------------------+------------------+----------------+ | id | from_device_id | to_device_id | message | date | from_screen_name | to_screen_name | +----+--------------------------------------+--------------------------------------+---------+---------------------+------------------+----------------+ | 20 | ffffffff-af28-3427-a2bc-83860033c587 | ffffffff-af28-3427-a2bc-83865900edbe | ee | 2011-02-28 12:36:38 | kevin | handset | | 1 | ffffffff-af28-3427-a2bc-83865900edbe | ffffffff-af28-3427-a2bc-83860033c587 | yyy | 2011-02-27 17:43:17 | handset | kevin | +----+--------------------------------------+--------------------------------------+---------+---------------------+------------------+----------------+ 2 rows in set (0.00 sec)</p> <p>

Как и ожидалось, возвращаются две строки.Как я могу изменить этот запрос, чтобы он возвращал только одну строку?

mysql> describe chat; +----------------+---------------+------+-----+-------------------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------------+---------------+------+-----+-------------------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | from_device_id | varchar(128) | NO | | NULL | | | to_device_id | varchar(128) | NO | | NULL | | | message | varchar(2048) | NO | | NULL | | | date | timestamp | YES | | CURRENT_TIMESTAMP | | +----------------+---------------+------+-----+-------------------+----------------+ 5 rows in set (0.00 sec)

Ответы [ 2 ]

2 голосов
/ 28 февраля 2011

Вам вообще не нужно использовать Group By. Скорее, вы можете просто использовать предикат Limit для возврата последней строки. Кроме того, вам не нужны подзапросы, так как вы можете просто использовать Joins. Если chat.from_device_id и chat.to_device_id не могут обнуляться, то вы можете заменить левые соединения внутренними.

Select chat.id
    , chat.from_device_id
    , chat.to_device_id
    , chat.message
    , chat.date
    , FromUser.screen_name As from_screen_nam
    , ToUser.screen_name As to_screen_name 
From chat
    Left Join usr As FromUser
        On FromUser.device_id = chat.from_device_id
    Left Join usr As ToUser
        On ToUser.device_id = chat.to_device_id
Where chat.to_device_id="ffffffff-af28-3427-a2bc-83865900edbe" 
    Or chat.from_device_id="ffffffff-af28-3427-a2bc-83865900edbe" 
Order By chat.date Desc
Limit 1 
2 голосов
/ 28 февраля 2011
select chat.*, 
       (select screen_name 
        from usr 
        where chat.from_device_id=usr.device_id
        limit 1
       ) as from_screen_name, 
       (select screen_name 
        from usr 
        where chat.to_device_id=usr.device_id
        limit 1
       ) as to_screen_name
from chat 
where to_device_id="ffffffff-af28-3427-a2bc-83865900edbe" or 
      from_device_id="ffffffff-af28-3427-a2bc-83865900edbe" 
group by from_device_id, to_device_id
order by date DESC
limit 1;

Вы должны указать SQL, что он должен отсортировать возвращаемые данные по дате, чтобы получить самый последний чат.Тогда вы просто ограничите количество возвращаемых строк до 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...