Моё меню Общее меню Сообщество Правила форума Все прочитано
Вернуться   uForum.uz > ИКТ и телеком > Разное/IT
Сообщения за день Поиск
Знаете ли Вы, что ...
...для каждой темы существует свой раздел. Изучите структуру форума. Если соответствующего раздела нет, то всегда есть раздел "Разное" :)
<< Предыдущий совет - Случайный совет - Следующий совет >>

Разное/IT Всё, что не попадает в другие разделы форума и подфорумов представленных здесь организаций. Не IT темы обсуждаются в "Беседке"


Ответить

 
Опции темы Опции просмотра
Старый 13.10.2013 15:50   #1  
Real ID Group Ultimate 2008
Аватар для Alisher Umarov
Оффлайн
AKA:Jazz
Сообщений: 4,528
+ 1,247  2,402/1,186
– 5  244/97

Uzbekistan
Развлекаемся с SQL

Ставим задачи - находим эффектные решения.
(В базе MySQL)

1. Виртуальный колхоз "Кизил пиёз. Пять бригад каждый день сдают на склад пиёз в кг.
Текущий отчёт:
За день. За неделю. За месяц. За квартал. За год.

ps. Без флейма плиз.
Красивые решения плюсуем.
Ответить 
Старый 13.10.2013 16:26   #2  
Заблокирован(а)
Аватар для JackDaniels
Оффлайн
Сообщений: 18,519
+ 10,956  12,586/6,453
– 307  539/385

Vatican City State
2. Дано 1М записей;
Не самый производительный сервер;

Нужно: ORDER BY RAND() LIMIT 10;


В качестве временного решения работает:

Первый запрос: узнаем количество записей в базе ($min, $max)
В PHP генерим 10 "случайных" индексов: $id[$i] = rand($min, $max);
Второй запрос: UNION (SELECT * FROM `a` WHERE `id` = $id[0] LIMIT 1) UNION (SELECT * FROM `a` WHERE `id` = $id[1] LIMIT 1)… и так далее.
Проверяем результат, если записи по одному из ID не было (в ID бывают "дырки"), и получили меньше чем 10, добираем нужное количество запросов.

Такая штуковина работает быстро (в сотни, и даже тысячи раз быстрее родного BY RAND()), но неэстетично.
Ответить 
Старый 14.10.2013 12:39   #3  
uParty Member Known ID Group
Аватар для DarkUser
Оффлайн
Служу Его Божественной Тени!
Сообщений: 1,671
+ 4,505  1,372/657
– 164  33/27

Uzbekistan
Цитата:
Сообщение от JackDaniels Посмотреть сообщение
Второй запрос: UNION (SELECT * FROM `a` WHERE `id` = $id[0] LIMIT 1) UNION (SELECT * FROM `a` WHERE `id` = $id[1] LIMIT 1)… и так далее.
Проверяем результат, если записи по одному из ID не было (в ID бывают "дырки"), и получили меньше чем 10, добираем нужное количество запросов.
Зачем извращяться с поиском ID-шника, если можно сразу выбрать запись с нужным порядковым номером?

Да, и если выбирать нужно часто, а меняется таблица редко, то есть смысл сразу ID-шники в массив выгрузить, и потом уже по нему рандомом выбирать...
__________________
Are you my mommy?

Последний раз редактировалось DarkUser; 14.10.2013 в 12:42.
Ответить 
2 "+" от:
Старый 14.10.2013 13:18   #4  
Заблокирован(а)
Аватар для JackDaniels
Оффлайн
Сообщений: 18,519
+ 10,956  12,586/6,453
– 307  539/385

Vatican City State
Цитата:
Сообщение от DarkUser Посмотреть сообщение
Зачем извращяться с поиском ID-шника, если можно сразу выбрать запись с нужным порядковым номером?
Разве перед получением строки по порядковому номеру ненужно сортировать таблицу по какому-то из признаков?
Ответить 
Старый 14.10.2013 15:06   #5  
uParty Member Known ID Group
Аватар для DarkUser
Оффлайн
Служу Его Божественной Тени!
Сообщений: 1,671
+ 4,505  1,372/657
– 164  33/27

Uzbekistan
Цитата:
Сообщение от JackDaniels Посмотреть сообщение
Разве перед получением строки по порядковому номеру ненужно сортировать таблицу по какому-то из признаков?
Если делать запрос вида Select * from table limit 1 offset N (где N - заранее сгенерированный случайный номер из [0 .. count - 1]), то - нет. А так, запрос без указания Order By обычно инвариантен и порядок строк соответствует порядку хранения данных в таблице.
__________________
Are you my mommy?
Ответить 
Старый 19.10.2013 02:23   #6  
uParty Member Known ID Group Ultimate
Аватар для OmoN
Оффлайн
програмщег
Сообщений: 4,971
+ 2,743  5,086/2,116
– 69  99/68

Uzbekistan
Цитата:
Сообщение от JackDaniels Посмотреть сообщение
2. Дано 1М записей;
Не самый производительный сервер;
Нужно: ORDER BY RAND() LIMIT 10;
Таблица:
PHP код:
create table TASK_2
(
  
id  NUMBER,
  
val NUMBER

Запрос:
PHP код:
Select IdVal
  From 
(Select Distinct IdValTrunc(Dbms_Random.Value(11000000)) Rand
          From Task_2
         Order By Rand
)
 
Where Rownum 11 
ПС: Прощу прощение что все решение на оракле. У меня нет MySQL.
__________________
Ошибки прошлого, мудрость будущего. (с)Д.Тернер.
Ответить 
Старый 13.10.2013 16:54   #7  
Real ID Group
Аватар для Denis Shlyapnikov
Оффлайн
FreeLance
Python/PHP программист
Сообщений: 1,054
+ 886  435/275
– 35  6/6

Russian FederationОтправить сообщение для Denis Shlyapnikov с помощью Skype™Facebook
`id` in уже не ?
__________________
http://hit-season.net/ - сериалы On-Line!
Ответить 
"+" от:
Реклама и уведомления
Старый 13.10.2013 16:57   #8  
Real ID Group
Аватар для Denis Shlyapnikov
Оффлайн
FreeLance
Python/PHP программист
Сообщений: 1,054
+ 886  435/275
– 35  6/6

Russian FederationОтправить сообщение для Denis Shlyapnikov с помощью Skype™Facebook
Я как-то работал с записями больше чем 1М, там я реализовал "сложную (с relations)" выборку через временные таблицы. Работает не то что быстро, а моментально.
__________________
http://hit-season.net/ - сериалы On-Line!
Ответить 
Старый 13.10.2013 17:14   #9  
Заблокирован(а)
Аватар для JackDaniels
Оффлайн
Сообщений: 18,519
+ 10,956  12,586/6,453
– 307  539/385

Vatican City State
Цитата:
Сообщение от Denis Shlyapnikov Посмотреть сообщение
там я реализовал "сложную (с relations)" выборку через временные таблицы
Чем это поможет при сортировке?
Или это к вопросу №1 было?
Ответить 
Старый 13.10.2013 17:20   #10  
Real ID Group
Аватар для Denis Shlyapnikov
Оффлайн
FreeLance
Python/PHP программист
Сообщений: 1,054
+ 886  435/275
– 35  6/6

Russian FederationОтправить сообщение для Denis Shlyapnikov с помощью Skype™Facebook
Нет, Руслан. Это к вашей задачи решение. Спокойно можно использовать ORDER BY RAND() + дополнительные маневры в виде where, group, join
__________________
http://hit-season.net/ - сериалы On-Line!
Ответить 
Ответить




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd. Перевод: zCarot
Advertisement System V2.5 By Branden
OOO «Единый интегратор UZINFOCOM»


Новые 24 часа Кто на форуме Новички Поиск Кабинет Все прочитано Вверх