PHP / MySQL Проверка данных между таблицами с длинным запросом - PullRequest
0 голосов
/ 09 июня 2011

Это более подробный вопрос, так как моя предыдущая попытка была недостаточно ясной. Я новичок в MySQL и понятия не имею, как лучше всего делать определенные вещи. Я создаю приложение для голосования для изображений, и у меня возникают проблемы с некоторыми тонкостями MySQL

My db

_votes

  • ID
  • voter_id
  • image_id

_images

  • ID
  • 1020 * имя_файл *
  • entrant_id
  • 1024 * одобрено *

_users

  • id
  • ...

В основном мне нужно сделать следующее:

  1. подсчитать все утвержденные голоса
  2. вернуть 5 лучших с наибольшим количеством голосов
  3. проверить, проголосовал ли пользователь по каждому из этих 5 (верните логическое) из другой таблицы

Я пробовал варианты

SELECT i.id, i.file_name, i.total_votes
FROM _images i WHERE i.approved = 1 
CASE WHEN (SELECT count(*) from _votes v WHERE v.image_id = i.id AND v.voter_id = ?) > 0 THEN '1' ELSE '0' END 'hasvoted'
ORDER BY i.total_votes DESC LIMIT ".($page*5).", 5

это то, что я должен попробовать и сделать все в одном запросе?

Этот запрос работал нормально, прежде чем я попытался добавить логическое значение hasvoted:

SELECT id, file_name, total_votes FROM _images WHERE approved = 1 ORDER BY total_votes DESC LIMIT ".($page*5).", 5

В данный момент я также храню подсчет голосов в таблице _images и знаю, что это неправильно, но я не знаю, как подсчитать голоса по image_id и затем упорядочить их.

1 Ответ

2 голосов
/ 09 июня 2011

Позвольте мне попробовать, чтобы понять, понимаю ли я ваш вопрос:

SELECT i.*,(SELECT COUNT(*) FROM _votes WHERE i.id = image_id) AS total_votes, (SELECT count(*) from _votes where i.id = image_id and user_id = ?) as voted  FROM _images AS i WHERE i.approved = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...