BoBka-altRUist
Новичок
оптимизация запроса для выборки id в игровом процессе
добрый день,
есть таблица с id, id такого вида
id pass_id | date
1 | 123000001 | 2010-07-01 12:34:32
2 | 123000413 | 2010-07-01 12:35:33
3 | 123000503 | 2010-07-02 12:38:23
4 | 123000614 | 2010-07-03 12:45:12
5 | 123000614 | 2010-07-03 12:46:33
6 | 123000629 | 2010-07-03 12:50:02
7 | 123000677 | 2010-07-03 12:50:11
8 | 123004708 | 2010-07-03 12:51:12
9 | 123004718 | 2010-07-04 12:51:21
10 | 123004719 | 2010-07-04 12:55:56
11 | 123004729 | 2010-07-04 12:55:59
...
и так далее (это генерация для игры)
проблема в том что выданные коды (pass_id) они неуникальные (могут повторяться)
- уникальные можно отобрать через group by pass_id
а кроме того они встречаются довольно близкие,
нужно, за период (за 7-й месяц, за 3-е число), из уникальных pass_id взять близкие ("близкие" это значит все разряды совпадают кроме последних двух) но в случае если таких "близкие" больше 2-х
все остальные поля неважны
кроме того скажу что в таблице есть доп. поле pass_add (где записан id без последних двух разрядов - так сказать в помощь)
из примера выше должно получиться:
pass_id
123000614
123000629
123000677
я делал так:
сначала запрос: выбрать "близкие" у которых повторений больше 2
SELECT `pass_add`
FROM `table`
WHERE (
`date`
BETWEEN '2010-07-03 00:00:00'
AND '2010-07-03 23:59:59'
)
GROUP BY `pass_add`
HAVING COUNT( `pass_add` ) >2
ORDER BY `pass_add`
а потом поместить его внутрь другого
SELECT `pass_id`
FROM `table` where (
`date`
BETWEEN '2010-07-03 00:00:00'
AND '2010-07-03 23:59:59'
) AND `pass_add` IN (
SELECT `pass_add`
FROM `table`
WHERE (
`date`
BETWEEN '2010-07-03 00:00:00'
AND '2010-07-03 23:59:59'
)
GROUP BY `pass_add`
HAVING COUNT( `pass_add` ) >2
ORDER BY `pass_add`
)
скажите это правильно или можно проще и легче?
добрый день,
есть таблица с id, id такого вида
id pass_id | date
1 | 123000001 | 2010-07-01 12:34:32
2 | 123000413 | 2010-07-01 12:35:33
3 | 123000503 | 2010-07-02 12:38:23
4 | 123000614 | 2010-07-03 12:45:12
5 | 123000614 | 2010-07-03 12:46:33
6 | 123000629 | 2010-07-03 12:50:02
7 | 123000677 | 2010-07-03 12:50:11
8 | 123004708 | 2010-07-03 12:51:12
9 | 123004718 | 2010-07-04 12:51:21
10 | 123004719 | 2010-07-04 12:55:56
11 | 123004729 | 2010-07-04 12:55:59
...
и так далее (это генерация для игры)
проблема в том что выданные коды (pass_id) они неуникальные (могут повторяться)
- уникальные можно отобрать через group by pass_id
а кроме того они встречаются довольно близкие,
нужно, за период (за 7-й месяц, за 3-е число), из уникальных pass_id взять близкие ("близкие" это значит все разряды совпадают кроме последних двух) но в случае если таких "близкие" больше 2-х
все остальные поля неважны
кроме того скажу что в таблице есть доп. поле pass_add (где записан id без последних двух разрядов - так сказать в помощь)
из примера выше должно получиться:
pass_id
123000614
123000629
123000677
я делал так:
сначала запрос: выбрать "близкие" у которых повторений больше 2
SELECT `pass_add`
FROM `table`
WHERE (
`date`
BETWEEN '2010-07-03 00:00:00'
AND '2010-07-03 23:59:59'
)
GROUP BY `pass_add`
HAVING COUNT( `pass_add` ) >2
ORDER BY `pass_add`
а потом поместить его внутрь другого
SELECT `pass_id`
FROM `table` where (
`date`
BETWEEN '2010-07-03 00:00:00'
AND '2010-07-03 23:59:59'
) AND `pass_add` IN (
SELECT `pass_add`
FROM `table`
WHERE (
`date`
BETWEEN '2010-07-03 00:00:00'
AND '2010-07-03 23:59:59'
)
GROUP BY `pass_add`
HAVING COUNT( `pass_add` ) >2
ORDER BY `pass_add`
)
скажите это правильно или можно проще и легче?