SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 15.05.2010 23:26:17

FiMko
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 18.09.2009
Сообщений: 198

Выскажите ваши замечания по запросу

Ребята, не могли бы вы помочь мне в некотором вопросе. Опишу задачу:

Имеется первая таблица:


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)

Неактивен

 

#2 16.05.2010 17:18:19

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

Re: Выскажите ваши замечания по запросу

Предлагаю в первую таблицу добавить в явном виде номер группы (т.е. чтобы было
group_id, id_within_group, word_id). Тогда и структура данных будет понятной, и
запросы будут хорошими.

Неактивен

 

#3 16.05.2010 21:27:22

FiMko
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 18.09.2009
Сообщений: 198

Re: Выскажите ваши замечания по запросу

paulus написал:

Предлагаю в первую таблицу добавить в явном виде номер группы (т.е. чтобы было
group_id, id_within_group, word_id). Тогда и структура данных будет понятной, и
запросы будут хорошими.

Здорово, спасибо! Я так понимаю сам запрос строгих замечаний не выявил, а вот по структуре базы отличное предложение! Вот только, похоже, можно обойтись и без id_within_group, мне вроде бы эта информация не нужна сама по себе, то есть оставить только две колонки group_id и word_id, но group_id сделать "сквозным", т.е. для всех элементов первой группы group_id=1, для всех элементов второй группы group_id=2 и т.д.

Неактивен

 

Board footer

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