|
|
|
2 Хрен
|
|||
|---|---|---|---|
|
#18+
Пару слов по поводу "задачки"... Постараюсь объяснить почему мне понравилось именно данное решение. :) * во-первых, оно написано на стандартном SQL и будет работать везде, где есть min(), group by & distinct * во-вторых, если вы смотрели топик, то могли заметить, что там было предложенно очень много изящных решений с особенностями конкретной СУБД * а в-третьих, в посте есть такая фраза ИМХО , пожалуй самое оригинальное решение Что касается использования HANDLER я так и не понял чем же он лучше в данном контексте, кроме как MySQL Manual :: HANDLER \x7f Он быстрее чем SELECT, потому что: Выделенный код обработчика таблиц создается в потоке по вызову HANDLER open. Меньше синтаксического анализа. Нет нагрузки на оптимизацию и проверку. Таблицу не нужно блокировать между запросами. Этот интерфейс не обязан предоставлять целостный вид данных (скажем, грязное чтение допускается), что позволяет обработчику таблиц делать оптимизации которые SQL обычно не допускает. \x7f Гораздо легче переносить на MySQL приложения, которые используют интерфейс, подобный ISAM. \x7f Такой интерфейс позволяет просматривать базу данных способом, который не так легко (или в некоторых случаях и вовсе невозможно) реализовать с помощью SQL. Интерфейс HANDLER является более естественным способом получить данные, когда приходится иметь дело с интерактивными пользовательскими приложениями. Вовсе не против и рад буду увидеть ваш вариант решения. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2005, 09:46 |
|
||
|
2 Хрен
|
|||
|---|---|---|---|
|
#18+
Мне бы вот тоже хотелось. Решением головоломок на SQL я немного интересуюсь (не имея в виду темы "помогите составить запрос", а именно головоломок). Так вот по поводу HANDLER - действительно не оно, потому как в условии физическое расположение записей в файле данных не задано. А ответа от г.Хрена дождаться будет непросто. Сценарий развития темы на этом форуме примерно такой - 1) Пишется вопрос 2) Даетcя ответ RTM. Этот ответ я сам могу давать причем на любой вопрос из любой области человеческой деятельности. ИМХО если уж решили послать человека в мануал, так хотя бы главу надо говорить... 3) Дается оригинальный ответ (не всегда, конечно, но бывает) 4) Появляется пост г.Хрена "...хрен оно так ...." 5) Молчание г.Хрена на попытки подискутировать - игнор аргументов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2005, 20:32 |
|
||
|
2 Хрен
|
|||
|---|---|---|---|
|
#18+
Astron Так вот по поводу HANDLER - действительно не оно, потому как в условии физическое расположение записей в файле данных не задано. handler никак не связан с физическим расположением записей в файле данных. А ответа от г.Хрена дождаться будет непросто. Сценарий развития темы на этом форуме примерно такой - 1) Пишется вопрос 2) Даетcя ответ RTM. Этот ответ я сам могу давать причем на любой вопрос из любой области человеческой деятельности. ИМХО если уж решили послать человека в мануал, так хотя бы главу надо говорить... 3) Дается оригинальный ответ (не всегда, конечно, но бывает) 4) Появляется пост г.Хрена "...хрен оно так ...." 5) Молчание г.Хрена на попытки подискутировать - игнор аргументов. Ну чтож, раз я вижу тут личный наезд, на этот раз я отвечу. 1) я не имею возможности (и желания) постоянно торчать на форуме. 2) Я не обязан заниматься просветительской работой. Где именно посмотреть я наводку дал, судя по Вашему ответу - вы не очень и читали. 3) Я имею полное право игнорировать обсуждение, если считаю что оно пошло по кругу или перестало представлять для меня интерес. Теперь по поводу handler. итак исходная задача: "Как найти предыдущую и последующие записи в таблице для заданной при условии что последовательность идентификаторов (ID записей) не является непрерывной?" по вашему примеру: Код: plaintext 1. 2. 3. 4. 5. Дальше добавляем те же записи . Немного другим способом, потому что так, как это сделано в исходном сообщении (через union) на мой взгляд выглядит слишком непрофессионально. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Открываем handler: Код: plaintext 1. И получаем две следующие записи после id = 4; Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. И две предыдущие: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Видно, что последней записи просто нет (потому что запись с ID=4 нахолится слишком близко к началу таблицы если смотреть по первичному ключу) И теперь осталось закрыть обработчик, чтобы не тратить ресурсы Код: plaintext 1. отличия от решения Berkut: Данные выбираются по индексному файлу, практически не нагружая сервер. Выборка в варианте Berkut происходит с subselects, которые всегда с трудом поддаются оптимизации и основательно грузят сервер. То что Berkut's решение использует стандартный SQL это хорошо, но учитывая название темы (mysql cookroom) - на мой взгляд это не слишком большое достоинство. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2005, 21:19 |
|
||
|
2 Хрен
|
|||
|---|---|---|---|
|
#18+
2 Хрен Поначалу я решил, что ваше предложение использовать HANDLER относилось к решению "Интересной задачки", а не "Как найти предыдущую и последующие записи в таблице ...?". То, что оно действительно не самое оптимальное в плане производительности, согласен. Собственно я это и указал в "примечаниях". ХренДальше добавляем те же записи. Немного другим способом, потому что так, как это сделано в исходном сообщении (через union) на мой взгляд выглядит слишком непрофессионально. По поводу "непрофессионального добавления" предлагаю не спорить, т.к. это был всего лишь тестовый вариант. :) Хренотличия от решения Berkut: Данные выбираются по индексному файлу, практически не нагружая сервер. Выборка в варианте Berkut происходит с subselects, которые всегда с трудом поддаются оптимизации и основательно грузят сервер. То что Berkut's решение использует стандартный SQL это хорошо, но учитывая название темы (mysql cookroom) - на мой взгляд это не слишком большое достоинство. Данный пример был сделан на "скорую руку", и задача состояла именно в том, чтобы вытащить записи именно одним запросом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2005, 00:09 |
|
||
|
2 Хрен
|
|||
|---|---|---|---|
|
#18+
AstronМне бы вот тоже хотелось. Решением головоломок на SQL я немного интересуюсь Astron, очень буду рад увидеть и ваши решения в Кук-Рум =) Тем более, что вы немного интересуетесь . P.S. Собственно говоря, предложение об открытии данной ветки и ее поддержки адресовалось всем. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2005, 00:14 |
|
||
|
2 Хрен
|
|||
|---|---|---|---|
|
#18+
можно так еще и тоже по индексам все Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2005, 09:49 |
|
||
|
2 Хрен
|
|||
|---|---|---|---|
|
#18+
2 sanek842 Знаете в чем недостаток вашего решения? В том, что он не всегда работает правильно. :) Например, есть такой набор данных: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2005, 10:24 |
|
||
|
2 Хрен
|
|||
|---|---|---|---|
|
#18+
а,ну да наверно вот так нужно set @vid = 4; select (select id from test where id<@vid order by id desc limit 1 ) as min_id, (select id from test where id>@vid order by id asc limit 1 ) as max_id; с учетом того что id в таблице идет с постоянным увеличением ( autoincrement ) то должно работать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2005, 10:31 |
|
||
|
2 Хрен
|
|||
|---|---|---|---|
|
#18+
Berkutзаписи "сверху" и "снизу", т.е. min() и max(). а вычислять миним. и макс. значения думаю будет лишним т.к. id это primary key , т.е. уникален и мы ненарвемся на случай ( в моем запросе ) где prev_id будет равен curr_id , скажем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2005, 10:38 |
|
||
|
2 Хрен
|
|||
|---|---|---|---|
|
#18+
2 sanek842 Кидайте ваше новое решение в MySQL "Cook Room" . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2005, 10:55 |
|
||
|
2 Хрен
|
|||
|---|---|---|---|
|
#18+
sanek842:) Я серьезно! :) А почему бы и нет!? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2005, 11:08 |
|
||
|
2 Хрен
|
|||
|---|---|---|---|
|
#18+
так сделай там ссылку на этот топик, тем более тут еще вариант с handler :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2005, 11:40 |
|
||
|
2 Хрен
|
|||
|---|---|---|---|
|
#18+
Дело в том, что не хочется делать ссылки, т.к. не удобно будет потом искать информацию. ИМХО, идея как раз в том и состоит, чтобы собрать в одном месте "задачи" и их "решения". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2005, 11:51 |
|
||
|
2 Хрен
|
|||
|---|---|---|---|
|
#18+
Berkut 2 Хрен Поначалу я решил, что ваше предложение использовать HANDLER относилось к решению "Интересной задачки", а не "Как найти предыдущую и последующие записи в таблице ...?". Данный пример был сделан на "скорую руку", и задача состояла именно в том, чтобы вытащить записи именно одним запросом. Да, я признаться тоже так подумал. Поэтому использование HANDLER показалось мне не совсем оправданным. С расположением записей - мой косяк, признаю, как говориться "вода кипит при 90 градусах - с прямым углом (primary key) перепутал" 2 Хрен Уважаю как специалиста, честно, мой уровень будет пониже, но уж если отвечать в форум - то чтоб понятно было хотя бы автору топика. За наезд - извиняюсь, с вышесказанной оговоркой. 2 Berkut Так я же совсем немного интересуюсь. Собственно, в поисках таких задачек я сюда и заглядываю. Если у вас есть что-то нетривиальное - вперед. Тут ведь кроме "помогите составить запрос" редко что попадается.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2005, 12:15 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=33111539&tid=1853962]: |
0ms |
get settings: |
5ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
177ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
| others: | 222ms |
| total: | 490ms |

| 0 / 0 |
