#php #mysql #mysqli
#php #mysql — сервер #mysqli #mysql
Вопрос:
Это более подробный вопрос, поскольку моя предыдущая попытка была недостаточно ясной. Я новичок в MySQL и понятия не имею о лучшем способе выполнения определенных действий. Я создаю приложение для голосования за изображения, и у меня возникли проблемы с некоторыми тонкостями MySQL
Моя база данных
_votes
- ID
- voter_id
- image_id
_изображения
- ID
- имя_файла
- entrant_id
- одобрено
_users
- ID
- …
В принципе, мне нужно сделать следующее:
- подсчитайте все одобренные голоса
- верните топ-5, набравших наибольшее количество голосов
- проверьте, проголосовал ли пользователь за каждый из этих 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, и тогда я подбираюсь ближе. проголосовавший возвращает число, а не логическое значение