mysql выбирает все уникальные строки в одном столбце и все максимальные строки в другом столбце по дате и времени

Что мне нужно, чтобы получить самые последние (по date_time) unique player_id для каждого table_id

Таблица:

buyin_id   player_id   table_id       date_time
---------|-----------|----------|--------------------|
1    |    10     |    21    | 2015-01-26 00:00:01
2    |    11     |    21    | 2015-01-26 00:00:02
3    |    12     |    21    | 2015-01-26 00:00:03
4    |    10     |    21    | 2015-01-26 00:00:04
5    |    11     |    21    | 2015-01-26 00:00:05
6    |    12     |    22    | 2015-01-26 00:00:06
7    |    13     |    22    | 2015-01-26 00:00:07
8    |    13     |    22    | 2015-01-26 00:00:08

Желаемый результат:

buyin_id   player_id   table_id       date_time
---------|-----------|----------|--------------------|
3    |    12     |    21    | 2015-01-26 00:00:03
4    |    10     |    21    | 2015-01-26 00:00:04
5    |    11     |    21    | 2015-01-26 00:00:05
6    |    12     |    22    | 2015-01-26 00:00:06
8    |    13     |    22    | 2015-01-26 00:00:08

Я попытался что-то вроде этого, который возвращает только 1 строку вместо 1 строки на table_id

SELECT pb.buyin_id, pb.player_id, pb.buyin, pb.cashout, pb.cashout_error, pb.date_time
FROM poker_buyin AS pb
INNER JOIN (SELECT player_id, MAX(date_time) AS MaxDateTime
FROM poker_buyin GROUP BY player_id) groupedpb
ON pb.player_id = groupedpb.player_id
AND pb.date_time = groupedpb.MaxDateTime
WHERE pb.player_id = '$player_id'";

0

Решение

Упомянутый вами запрос находит самую последнюю запись для каждого идентификатора игрока. А затем вы фильтруете его, чтобы найти только одного игрока, чтобы получить один ряд.

Если вы хотите найти самую последнюю запись для каждого игрока и таблицы, ваш внутренний запрос должен быть таким:

            SELECT  MAX(buyin_id) buyin_id
FROM  poker_buyin
GROUP  BY player_id, table_id

Это получит идентификаторы строк из вашей таблицы, которые представляют последние комбинации игрока / стола.

Затем вы используете это для извлечения записей из вашей таблицы, как это (http://sqlfiddle.com/#!2/be68b7/2/0)

SELECT whatever_columns
FROM poker_buyin
WHERE buyin_id IN
(
SELECT  MAX(buyin_id) buyin_id
FROM  poker_buyin
GROUP  BY player_id, table_id
)
WHERE player_id = '$player_id'
ORDER BY player_id, table_id

В этом запросе есть небольшая хитрость: значение buyin_id постоянно увеличивается, так что это хороший способ выбора последних записей по времени для каждой комбинации.

0

Другие решения

если тебе не нужно buyin_id в столбцах результата это просто:

SELECT DISTINCT player_id, table_id, max(date_time) as dt
FROM `poker_buyin `
GROUP BY player_id, table_id
0

По вопросам рекламы [email protected]