SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 26.04.2011 17:18:35

VladimirPivovar
Завсегдатай
Зарегистрирован: 26.04.2011
Сообщений: 31

Выборка редко встречающихся записей по возрастанию

Есть таблица, subtask.

subtask_id status_id taken_at(время в секундах) filename
1 3 1303792954 2010-01-01
1 1 0 2010-01-02
1 1 0 2010-01-03
1 1 0 2010-01-04
2 1 0 2010-02-01
2 1 0 2010-02-02
3 3 1303792960 2010-03-01


Нужно составить 3 запроса, ничего в голову не приходит sad :


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

Вот что должно получиться

2 1 0 2010-02-01
2 1 0 2010-02-02
1 1 0 2010-01-02
1 1 0 2010-01-03
1 1 0 2010-01-04

2 ой запрос - в выборку должны попасть сначала записи:

2 1 0 2010-02-01
2 1 0 2010-02-02
1 1 0 2010-01-02
1 1 0 2010-01-03
1 1 0 2010-01-04
а потом
1 3 1303792954 2010-01-01
3 3 1303792960 2010-03-01

те те записи, у которых меньше всего встречается subtask_id и у которых status_id = 3

3 ий запрос что и первый, только должен сделать Update полей taken_at с приращением по времени в 180 секунд, т е каждое последующее время должно отличаться на 180 секунд и status_id поменять на 3

Вот что должно получиться

subtask_id status_id taken_at(время в секундах) filename
2 3 1303792954 2010-02-01
2 3 1303792954 +180 2010-02-02
1 3 1303792954 +360 2010-01-02
1 3 1303792954 + 540 2010-01-03
1 3 1303792954 + 720 2010-01-04

Заранее большое спасибо

Неактивен

 

#2 01.05.2011 04:01:51

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Выборка редко встречающихся записей по возрастанию

1. Без подзапроса, видимо, никак.

SELECT .. FROM tablename JOIN
(SELECT subtask_id FROM tablename GROUP BY 1 ORDER BY COUNT(*) DESC) s USING (subtask_id)
WHERE status_id != 3;

2. Весь пункт 1 целиком и к нему еще записи с третьим статусом:

...
UNION
SELECT ... FROM tablename WHERE status_id = 3;

3. Тут Вам не надо делать никакую сортировку. Просто
UPDATE tablename SET taken_at = taken_at + INTERVAL 180 SECONDS, status_id = 3 WHERE status_id != 3;

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson