Помогите выпольнить SQL запрос

#1 22 августа 2013 в 11:40
Надо выбрать из таблицы cms_users 12 случайных пользователей и что бы среди них был один конкретный пользователь
Выполняю так:
  1. SELECT i.*
  2. FROM cms_users i
  3. WHERE EXISTS (SELECT i.* FROM cms_users i WHERE i.id = 14) AND (i.pol = '2')
  4. ORDER BY RAND()
  5. LIMIT 0, 12
Пользователь с id 14 иногда появляется иногда пропадает, может быть это из за RAND()?

Как выполнить запрос что бы среди случайных пользователей присутствовал юзер с id 14
#2 22 августа 2013 в 12:51
Попробуйте выбрать конкретного юзера, а потом еще 11 случайных.
#3 22 августа 2013 в 13:26
Проблема в том, что ORDER BY RAND() и LIMIT 0, 12 задается к всему запросу, отсюда не получается сделать правильно выборку… Сейчас попробую поэкспериментировать…
#4 22 августа 2013 в 13:35
Вот вариант, вроде всё работает 😊
  1. SELECT i.id as id FROM cms_users i WHERE i.id!=16 LIMIT 0, 11
  2. UNION
  3. SELECT c.id as id FROM cms_users c WHERE c.id=16
  4. ORDER BY RAND()
#5 23 августа 2013 в 13:13
Отпишитесь хотя бы — правильно или нет… Интересно же))
#6 23 августа 2013 в 14:49
Project-S, Спасибо для данного запроса всё отлично работает)
Есть еще один запрос только там UNION пишет The used SELECT statements have a different number of columns...
Вообщем есть таблица cms_flirtiki и в нем 5 полей id, sender_id, to_user, popitka, status. Мне надо выводить список пользователей которые их ID и мой ID не совпадают в поле sender_id и to_user… Помоги разобраться уже два дня мучаюсь)
#7 23 августа 2013 в 15:07
Что-то не понял, что надо сделать))
Нужен более подробный пример...

Мне надо выводить список пользователей которые их ID и мой ID не совпадают в поле sender_id и to_user

Имеется ввиду, чтобы sender_id и to_user были разные? или что?
#8 23 августа 2013 в 15:32


Надо НЕ выводить тех кому я же отправил флиртик или от кого получал
допустим в таблице cms_flirtiki поля to_user не был ровно ID выводимого юзера (см. фото) и sender_id не был ровно мойID
#9 23 августа 2013 в 15:51
Вроде понятно 😊
А что если попробовать следующее?
Сразу отмечу, по запросам смотрите на нагрузку и время исполнения запроса. А то я Вам сейчас запросы понапишу, а потом у Вас будет много народу и хостинг не справится))
Итак, данный пример чисто наугад, так как у меня нет Вашей базы — пробуйте сами 😊
У Вас должна быть переменная, которая обозначается, кто я, то есть мое ID.
Допустим, эта переменная равна "14"
  1. SELECT us.id as user_id FROM cms_users us
  2. WHERE us.id NOT IN (SELECT sender_id FROM cms_flirtiki WHERE to_user=14)
  3. AND us.id NOT IN (SELECT to_user FROM cms_flirtiki WHERE sender_id=14)
  4.  
Но, что-то мне подсказывает, что этот запрос неправильный с точки зрения оптимизации...
Можете попробовать 😊
Отпишитесь о результатах…
#10 23 августа 2013 в 16:13
Project-S, Спасибо) работает) время исполнения проверил в phpmyadmin: Запрос занял 0.0073 сек.
Это нормально?
#11 23 августа 2013 в 16:26

время исполнения проверил в phpmyadmin: Запрос занял 0.0073 сек.
Это нормально?

Evanescence
Это надо Вам смотреть))
Чем больше будет таблица, тем медленнее запрос исполнится. Используйте в таблице индексы.
Экспериментируйте, ускоряя работу сайта.
#13 23 августа 2013 в 19:22

ORDER BY RAND() — Это Зло!

Александр
Его можно применять, но нужно ограничить разброс рандомного запроса. иначе будет ооочень медленно.

Для автора возможно будет полезно:
habrahabr.ru/post/55864/
#14 23 августа 2013 в 20:26
Я пока только учусь и по этому не знаю как использовать индексы в таблицах и как оптимизировать запросы… А вот насчет ORDER BY RAND() — случайная выборка используется в трех запросах в двух не объязательно по этому если это зло, могу использовать только в одном месте😊
Суть данного компонента в том что если Вася отправить флиртик Маше — у Машы будет 5 попыток и 12 случайных кандидатов и она должна найти того кто ей отправил флиртик, за каждую ошибку от имени Машы отправиться флиртик тому юзеру…

Вообщем компонент на 90% готовь и скоро выложу на паблик :)
#15 23 августа 2013 в 21:38
еще один вариант, получить общее кол-во записей в таблице, затем средствами пхп рандомно выбрать необходимое кол во id и сделать выборку по этим ид, т.е. рэндом будет использоваться пхп, а таблица лишь вернет записи тех значений которые передадут в запросе. Сумбурно написал, думаю разберетесь. + в том что запрос будет простым соответственно быстрее будет обработан.
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.