PHP / MySQL проверяет данные между таблицами с помощью длинного запроса

#php #mysql #mysqli

#php #mysql — сервер #mysqli #mysql

Вопрос:

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

Моя база данных

_votes

  • ID
  • voter_id
  • image_id

_изображения

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

_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:

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

 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
  

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

1. Каково определение столбца в _image.approved?

2. на самом деле, произошла ошибка, и я понял, что тот факт, что я использую подготовленные инструкции mysqli, может иметь значение : :$stmt = mysqli_prepare($ connection, «ВЫБЕРИТЕ i.*,(ВЫБЕРИТЕ COUNT( ) ИЗ _votes ГДЕ i.id = image_id) КАК total_votes, (ВЫБЕРИТЕ count( ) из _votes, где i.id = image_id и user_id = ?) как проголосовало _images AS i, ГДЕ i.approved = 1″); [Чт, 09 июня 16:00:27 2011] [ошибка] [клиент 192.168.1.113] PHP Предупреждение: mysqli_stmt_bind_param() ожидает, что параметр 1 будет mysqli_stmt, логическое значение, указанное в …

3. Я бы предложил сначала протестировать запрос непосредственно в mysql, чтобы убедиться, что он работает. В запросе действительно есть маркер привязки для user_id.

4. хорошая идея. привязка работает нормально, но я попробую напрямую

5. user_id должен быть voter_id, и тогда я подбираюсь ближе. проголосовавший возвращает число, а не логическое значение