Ребята, не могли бы вы помочь мне в некотором вопросе. Опишу задачу:
Имеется первая таблица:
select * from table1;
+--------------+-----------+
| group_id | word_id |
+--------------+-----------+
| 100 | 6 | # начало группы 1
| 101 | 7 | # конец группы 1
| 200 | 16 | # начало группы 2
| 201 | 18 | # конец группы 2
+--------------+-----------+
Имеется вторая таблица:
select * from table2;
+---------+-------+
| word_id | word |
+---------+-------+
| 1 | ab |
| 2 | abcd |
| 3 | def |
| 4 | defg |
+---------+-------+
Имеется запрос:
# выбрать все слова по их id, полученными на предыдущем этапе
select word from table2, (
# выбрать все word_id внутри группы (в каждой группе 100 элементов максимум) - получим word_id = 6 и 7
select word_id from table1, (
# найти id внутри группы, который соответствует word_id=7 (найдется table1.group_id=101)
select group_id from table1 where word_id=7 limit 1
) tmp where table1.group_id between tmp.group_id - (tmp.group_id mod 100) and
(tmp.group_id - (tmp.group_id mod 100)) + 99
) tmp where table2.word_id=tmp.word_id;
Как видно из таблицы 1, существуют группы по 100 элементов в каждой максимум (в приведенном примере всего по два элемента в группах, но в процессе работы группа может дополняться). Запрос ищет по заданному word_id, соответствующий ему номер в группе, затем выбираются все элементы группы (список word_id группы), далее по полученному списку word_id выбираются все фактические слова, соответствующие данным word_id (колонка word в таблице table2). Сложными могут показаться конструкции типа tmp.group_id - (tmp.group_id mod 100) - здесь ищется начальный id группы (кратный 100), (tmp.group_id - (tmp.group_id mod 100)) + 99 - конец группы.
Собственно, желательно чтобы вы оценили написанный запрос и высказали любую критику. Я как человек не опытный в MySQL мог написать запрос (а также есть подозрения и другие мои запросы) не оптимально. Заранее спасибо за любые замечания и дополнения и извините если выбрал слишком витиеватую задачку для оценки!
Отредактированно FiMko (15.05.2010 23:41:21)