Какой наиболее эффективный способ условно объединить две таблицы со случайным порядком результатов

#mysql

#mysql

Вопрос:

Проблема очень похожа на систему голосования stack exchange. Я хотел бы запросить таблицу объектов для случайного объекта, а также получить обратно все голоса, которые указанный пользователь имеет по этому объекту.

 objects table:
 id
 user_id
 message

votes table:
 object_id
 user_id
 vote_value
  

select * from objects order by RAND() создает случайный объект, но как я могу выбрать значение голоса конкретного пользователя для этого объекта в том же запросе? Возможно, что пользователь никогда не голосует за результирующий объект, поэтому я не могу просто выполнить объединение по id / object_id.

Комментарии:

1. Каким должен быть результат, если пользователь не голосовал за объект?

2. это должен быть просто идентификатор объекта и сообщение

Ответ №1:

Этот запрос будет напечатан NULL для user_id и vote_value , если пользователь (в данном случае 1 ) не проголосовал за объект:

 SELECT o.id, v.user_id, v.vote_value 
FROM objects o LEFT OUTER JOIN votes v ON o.id = v.object_id AND v.user_id = 1
WHERE v.user_id = 1 OR v.user_id IS NULL
ORDER BY RAND() LIMIT 1;
  

Комментарии:

1. Вы также могли бы использовать IFNULL() для печати всего, что вы хотите, вместо NULL : dev.mysql.com/doc/refman/5.0/en /…