я нашел существующие вопросы с последней/низкой одной строки на несколько полей или последние п строк по одному полю, а не два вместеMySql - выберите верхние п строки, сгруппированные по 2 колонке
мне нужно построить 2 запросы, используя этот пример таблицы (аналогичную this question)
CREATE TABLElap_data
(id
int(1) NOT NULL,track_id
int(1) NOT NULL,user_id
int(1) NOT NULL,lap_time
time NOT NULL,lap_status
tinyint(1) NOT NULL, PRIMARY KEY (id
) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
INSERT INTO `lap_data` (`id`, `track_id`, `user_id`, `lap_time`, `lap_status`) VALUES (1, 1, 1, '04:18:23', 1), (2, 2, 2, '01:09:54', 1), (3, 2, 1, '01:05:30', 1), (4, 1, 2, '04:17:02', 1), (5, 3, 2, '01:13:10', 1), (6, 4, 1, '01:36:59', 0), (7, 3, 2, '01:18:10', 1), (8, 2, 3, '01:06:42', 1), (9, 1, 1, '04:16:12', 1), (10, 1, 2, '04:18:12', 1), (11, 2, 3, '01:03:20', 1), (12, 2, 1, '01:08:13', 1), (13, 2, 1, '01:09:44', 1), (14, 3, 2, '01:14:10', 1), (15, 3, 2, '01:17:20', 1), (16, 4, 1, '01:36:23', 1), (17, 2, 1, '01:11:34', 1);
Query 1:
- Я хочу, чтобы верхние 2 результатов по lap_time - на дорожку, на одного пользователя
- так, если данный user_id 20 записей распространяются на 3 дорожки ...
- Я хотел бы ожидать 6 результатов что user_id
- или 5, если один из этих треков имеет только одну запись
- то же самое время на круге на 2-х различных направлениях, оба должны быть отображены, не появляются только один раз
- так, если данный user_id 20 записей распространяются на 3 дорожки ...
- Я хочу использовать WHERE user_id IN (..) для части 1
- заказанного данной области, т.е. lap_time
- где lap_status = 1
Это я запрос мы использовали в другом месте для сбора двух последних записей определенного типа, который наиболее близок к тому, что мне кажется необходимым, изменен в этом примере .. хотя и незавершенный, как в другом случае, он собирал только 2 последних строки для каждого user_id .. здесь мне нужно, чтобы он также учитывал track_id
SELECT
*
FROM (
SELECT
t.id,
t.track_id,
t.user_id,
t.lap_time,
t.lap_status,
@row:=case WHEN @prev=user_id THEN @row ELSE 0 END +1 rn,
@prev:=user_id
FROM `lap_data` t
CROSS JOIN (SELECT @row:=0, @prev:=null) c
WHERE t.user_id IN (1,2)
ORDER BY user_id, id DESC
) src
WHERE rn <= 2
ORDER BY lap_time DESC
Запрос 1 Желаемый результат: (ГДЕ идентификатор_пользователя В (1,2))
| id | track_id | user_id | lap_time | lap_status | -------------------------------------------------------------- | 9 | 1 | 1 | 04:16:12 | 1 | | 1 | 1 | 1 | 04:18:23 | 1 | | 3 | 2 | 1 | 01:05:30 | 1 | | 12 | 2 | 1 | 01:08:13 | 1 | | 16 | 4 | 1 | 01:36:23 | 1 | | 6 | 4 | 1 | 01:36:59 | 1 | | 4 | 1 | 2 | 04:17:02 | 1 | | 10 | 1 | 2 | 04:18:12 | 1 | | 2 | 2 | 2 | 01:09:54 | 1 | | 5 | 3 | 2 | 01:13:10 | 1 | | 14 | 3 | 2 | 01:14:10 | 1 |
Запрос 2:
- Я хочу, чтобы получить обратную выше , для одного пользователя
- т.е. остальная часть результатов, за исключением f рвые два, для всего конкретного user_id
Запрос 2 Желаемый результат: (WHERE user_id = '1')
| id | track_id | user_id | lap_time | lap_status | -------------------------------------------------------------- | 13 | 2 | 1 | 01:09:44 | 1 | | 17 | 2 | 1 | 01:11:34 | 1 |
Любые предложения? благодаря!
Вы еще что-нибудь пробовали? –
@Strawberry добавил ребята, спасибо за подсказку –
Ваши усилия выглядят очень близко - вы уверены, что не можете понять, как это приспособить? – Strawberry