Выбор записи из БД (нужен совет)

#16 27 сентября 2012 в 12:13
  1. ORDER BY `rating` DESC LIMIT 1
Так легче запросу вместо rand() ?
INNER JOIN просто вместо LEFT JOIN? или как запрос будет выглядеть?
#17 27 сентября 2012 в 12:19

Ленивый:
Как обычно в своём репертуаре!!! :))))
поясните

Ленивый
не в первый раз.

Ленивый:
не проще написать менее ресурсоёмкую операцию!?
Fuze:
можно воспользоваться INNER JOIN, если я правильно понял задачу.
Прочитать выше религия не позволяет?

Fuze
Вы предлагаете ИННЕР ДЖОИНОМ случайную запись из таблицы достать!!!???
#18 27 сентября 2012 в 12:25

Код PHP:

ORDER BY `rating` DESC LIMIT 1

Так легче запросу вместо rand() ?
INNER JOIN просто вместо LEFT JOIN? или как запрос будет выглядеть?

kreator

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


Делайте так и радуйтесь
  1. SELECT f.*, t. *
  2. FROM `cms_fotos` f
  3. LEFT JOIN `cms_golosa` t ON t.foto_id = f.id AND t.user_ip != ip_юзера
  4. ORDER BY rand( )
  5. LIMIT 1
#19 27 сентября 2012 в 12:27

Вы предлагаете ИННЕР ДЖОИНОМ случайную запись из таблицы достать!!!???

Ленивый
нет, это был ответ к

Предчувствую тут косяк из-за того, что в таблице_2 одному id таблицы_1 могут соответствовать несколько строк

Ленивый
если в таблице мало записей, то ORDER BY RAND() разумеется никаких тормозов не сделает.
#20 27 сентября 2012 в 13:00

можно воспользоваться INNER JOIN, если я правильно понял задачу.

Fuze
по дублям дает тот же результат, что и LEFT JOIN

GROUP BY f.id

Марат

не уверен....

Ленивый
перед тем как выкладывать проверял, работает. И вообще, GROUP BY отличное средство для уборки дублей. Придумал не сам. Взято с форумов кодеров.

ORDER BY `rating` DESC LIMIT 1

kreator
хорошее решение. но лучше сортировать по id и по убыванию. пользователю будет выдваваться последние добавленные, т.е. более новые.
Самый первый запрос приводил только для того, чтобы понять суть, как решать. Поэтому там без ордер бай, и прочего. Берет все запросы. Додумать и доделать уже не сложно.

INNER JOIN просто вместо LEFT JOIN ?

kreator
да
#21 27 сентября 2012 в 14:19

Марат:
GROUP BY f.id
Ленивый:
не уверен....
перед тем как выкладывать проверял, работает. И вообще, GROUP BY отличное средство для уборки дублей. Придумал не сам. Взято с форумов кодеров.

Марат

"Если при наличии предложения GROUP BY, в предложении SELECT отсутствуют агрегатные функции, то запрос просто вернет по одной строке из каждой группы." (http://www.sql-tutorial.ru/ru/book_group_by_clause.html)

То есть, если в таблице голосов будет несколько проголосовавших за данный Итем, а потом будет "мой" голос, то данный запрос НЕ УВИДИТ "мой" голос и может предложить мне проголосовать за тот же самый Итем повторно
#22 27 сентября 2012 в 15:18

о есть, если в таблице голосов будет несколько проголосовавших за данный Итем, а потом будет "мой" голос, то данный запрос НЕ УВИДИТ "мой" голос и может предложить мне проголосовать за тот же самый Итем повторно

Ленивый
Вы правы. Не додумал. Ваш вариант будет самый верный:

Код PHP:
SELECT f.*, t. *
FROM `cms_fotos` f
LEFT JOIN `cms_golosa` t ON t.foto_id = f.id AND t.user_ip != ip_юзера
ORDER BY rand( )
LIMIT 1

Ленивый
#23 27 сентября 2012 в 19:07
если записей в таблице меньше 10-20 тысяч то можно использовать и
  1. ORDER BY rand( )
при больших объемах время запроса будет расти в геометрической прогрессии:) тогда лучше использовать алгоритм: получить максимальное количество записей по нужному запросу и сгенерировать случайное число и с помощью
  1. LIMIT {$rand}, {$count}
получить запись(и)
p.s индексы никто не отменял

Вы предлагаете ИННЕР ДЖОИНОМ случайную запись из таблицы достать!!!???

можно и при таком раскладе достать случайную запись из присоединяемой таблицы laughcrazy
#24 6 октября 2012 в 22:08
че то не работает никак? може есть варианты еще?
#25 6 октября 2012 в 22:38
Велик и могуч яндекс и гугл. Так работает:
  1. SELECT таблица1.*
  2. FROM таблица1
  3. LEFT JOIN таблица2
  4. ON таблица1.id=таблица2.id AND таблица2.ip != '$ip'
  5. ORDER BY rand()
  6. LIMIT 1
#26 6 октября 2012 в 23:18

Так работает:

kreator
А в чём разница!!?? :)))
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.