SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 31.08.2008 13:22:21

s_popov
Участник
Зарегистрирован: 31.08.2008
Сообщений: 18

order by rand()

Привет всем!

Вот возникла ситуация:
необходимо отбирать случайные записи, прочитал что можно воспользоваться
запросом "select *from table1 order by rand() limit 0,10" (для примера)
все работает отлично, но далее заказчик захотел сортировать еще эти записи по имени продукта.

Так вот если я пишу select *from table1 order by name,rand() limit 0,10
или select *from table1 order by rand(),name limit 0,10 - запрос срабатывает без rand().

Можно ли как-то отсортировать данные если есть rand()?

Неактивен

 

#2 31.08.2008 14:12:40

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: order by rand()

Запрос select * from table1 order by name,rand() limit 0,10
отсортирует записи по имени, а среди  записей с одинаковым именем произойдет сортировка по rand()

Неактивен

 

#3 31.08.2008 14:29:28

s_popov
Участник
Зарегистрирован: 31.08.2008
Сообщений: 18

Re: order by rand()

да в том то и дело что rand() несрабатывает вобще
выводятся первые 10 записей по алфавиту

Неактивен

 

#4 31.08.2008 14:31:14

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: order by rand()

Правильно, в такой схеме rand() будет менять местами ТОЛЬКО записи, у которых имя совпадает. Поясните пожалуйста на словах, а лучше на примере, какую сортировку Вы хотите добиться.

Неактивен

 

#5 31.08.2008 14:31:27

s_popov
Участник
Зарегистрирован: 31.08.2008
Сообщений: 18

Re: order by rand()

вот структура таблицы:

id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (id),
name TEXT NOT NULL

Неактивен

 

#6 31.08.2008 14:33:36

s_popov
Участник
Зарегистрирован: 31.08.2008
Сообщений: 18

Re: order by rand()

в ней записан список имен производителей всего будет около 1500
я хочу на первой странице вывести случайных 10 производителей отсортированных по именам

Неактивен

 

#7 31.08.2008 14:35:33

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: order by rand()

SELECT * FROM (SELECT * FROM tbl ORDER BY rand() LIMIT 10) AS T ORDER BY name;

Неактивен

 

#8 31.08.2008 14:39:35

s_popov
Участник
Зарегистрирован: 31.08.2008
Сообщений: 18

Re: order by rand()

спасибо, попробую

Неактивен

 

#9 31.08.2008 14:41:37

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: order by rand()

Запомните простое правило - если запрос один, то LIMIT работает всегда после сортировки. Поэтому Ваша задача решается только подзапросом.

Неактивен

 

#10 31.08.2008 14:59:59

s_popov
Участник
Зарегистрирован: 31.08.2008
Сообщений: 18

Re: order by rand()

Вот по Вашему примеру сделал запрос сложнее:

select * from (
    SELECT mk_catalog_product.*, mk_product.pref
    FROM mk_catalog_product LEFT JOIN mk_product ON mk_catalog_product.id_main = mk_product.id ORDER BY RAND() limit 0,15) as T
order by name

Неактивен

 

#11 31.08.2008 15:01:15

s_popov
Участник
Зарегистрирован: 31.08.2008
Сообщений: 18

Re: order by rand()

выдается ошибка: Duplicate column name 'pref'
но я же это поле явно указываю "mk_product.pref"

Неактивен

 

#12 31.08.2008 15:03:08

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: order by rand()

Поле присутствует дважды. Заменить mk_catalog_product.* на перечисление необходимых Вам полей из этой таблицы.

Второй вариант - дать алиас полю pref: mk_catalog_product.*, mk_product.pref AS mkpref

Неактивен

 

#13 31.08.2008 15:13:13

s_popov
Участник
Зарегистрирован: 31.08.2008
Сообщений: 18

Re: order by rand()

большое спасибо, дал алиас полю и помогло

Неактивен

 

#14 31.08.2008 15:30:34

s_popov
Участник
Зарегистрирован: 31.08.2008
Сообщений: 18

Re: order by rand()

а можно еще вопрос?
правда не по этой теме, но он как бы касается этих запросов

На странице я вывожу информацию, а внизу две ссылки на следующую запись
и на предыдущую.
Сейчас я делаю это перебором в коде PHP всей таблицы, а может можно запросом как-то выделить эти записи?

Неактивен

 

#15 31.08.2008 15:33:19

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: order by rand()

Что означают следующая и предудущая записи?

Неактивен

 

#16 31.08.2008 16:01:10

s_popov
Участник
Зарегистрирован: 31.08.2008
Сообщений: 18

Re: order by rand()

да это я наверное сильно много хочу от запросов
ну хотя может и есть какие-нибудь методы

допустим записи:

Аня
Вася
Петя
Федя
Яна

так вот если выберу Петю
можно ли определить ID Васи и Феди

Неактивен

 

#17 31.08.2008 16:02:24

s_popov
Участник
Зарегистрирован: 31.08.2008
Сообщений: 18

Re: order by rand()

естественно ID у них непопорядку идут

Неактивен

 

#18 31.08.2008 16:26:30

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: order by rand()

А как отсортированы? Если по имени, то
SELECT * FROM table where name > 'Петя' ORDER BY name ASC LIMIT 1
это будет Федя
SELECT * FROM table where name < 'Петя' ORDER BY name DESC LIMIT 1
это будет Вася

Неактивен

 

#19 31.08.2008 16:29:00

s_popov
Участник
Зарегистрирован: 31.08.2008
Сообщений: 18

Re: order by rand()

отсортированы по названию

надо попробывать, я просто незнал что такие конструкции могут работать

Неактивен

 

Board footer

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