2012-03-31 4 views
1

У меня есть 3 таблицы со следующими столбцами:Рейтинг: Как выбрать следующий элемент, для которого пользователь не голосовал еще

* users : user_id 
* votes : user_id, creation_id 
* creations : creation_id, creation_points 

Каждый user может проголосовать один раз для каждого creation. Когда пользователь голос, это происходит:

  • Таблица votes: Вставьте новую строку с user_id и creation_id (так что мы можем проверить, если пользователь уже голосовал за это создание)
  • Таблицы creations: Добавить +1 к строка creation_points для соответствующего создания

Но теперь, я хочу, что когда пользователь успешно проголосовал за создание, она показывает ему следующий создание, для которого он еще не голосовать. Как я могу это достичь?

Я попробовал этот путь:

  1. Выберите следующий creation_id из creations таблицы (где creation_id больше, чем текущий creation_id)
  2. Проверьте, если пара creation_id & user_id уже существует в votes таблице. Если он существует, повторите попытку из 1).

Проблема с этим методом заключается в том, что ему нужно много запросов, если пользователь уже проголосовал за следующее создание. Он также создает бесконечный цикл, если он уже голосовал за все творения. Есть ли другие альтернативы?

ответ

2

Если я понимаю, как вы его обрабатываете, вы, кажется, находитесь на правильном пути, сохраняя votes как user_id и creation_id. Для получения следующего доступного создания, используйте LIMIT 1 запрос, исключающую уже голосовали-творениями:

Этот метод использует NOT IN() подзапрос:

SELECT 
creations.* 
FROM creations 
WHERE creation_id NOT IN (
    SELECT creation_id FROM votes WHERE user_id = <the user_id> 
) 
ORDER BY creation_id ASC 
LIMIT 1 

Похожие вещи, используя NOT EXISTS вместо:

SELECT 
creations.* 
FROM creations 
WHERE NOT EXISTS (
    SELECT creation_id 
    FROM votes 
    WHERE 
    user_id = <the user_id> 
    AND creations.creation_id = votes.creation_id 
) 
ORDER BY creation_id ASC 
LIMIT 1 
0

вы можете внести в таблицу голосов

если ваш текущий creat_id = 123456

ваш идентификатор пользователя = 789

SELECT c.creation_id 
FROM creations AS c 
INNER JOIN votes AS v ON v.creation_id = c.creations_id 
WHERE c.creation_id > 123456 AND v.user_id != 789 
ORDER BY c.creation_id ASC 
LIMIT 0,1 

 Смежные вопросы

  • Нет связанных вопросов^_^