PHP / MySQL Как получить значения из одной таблицы и сравнить с другой таблицей - PullRequest
0 голосов
/ 09 июня 2011

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

Чтобы получить изображения из таблицы изображений, яделаю это:

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

Но мне также нужно проверить в таблице «голосования», что их идентификатор пользователя еще не связан с идентификатором (image) из этого запроса.Мне нужно показывать только 5 изображений за раз, следовательно, LIMIT применяется к первому запросу.

Я не уверен, нужно ли мне выполнить несколько соединений или несколько запросов.

мой голосТаблица имеет поля:

  • id
  • voter_id
  • image_id

РЕДАКТИРОВАТЬ: Спасибо за все ваши отзывы.Немного больше информации:

total_votes показалось мне грязным, когда я положил его туда, но я не мог найти лучший способ подсчета голосов каждый раз.Разве не было бы неэффективно, если бы каждый раз, когда проводилось голосование или просили просмотреть список лидеров, все голоса должны быть подсчитаны и отсортированы?Прости меня за мои грехи - я не программист базы данных!

1 Ответ

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

Использование LEFT JOIN / IS NULL:

   SELECT i.id, i.file_name, i.total_votes 
     FROM _images i
LEFT JOIN VOTES v ON v.image_id = i.id
                 AND v.voter_id = ?
    WHERE approved = 1 
 ORDER BY total_votes DESC 
    LIMIT ".($page*5).", 5"

Использование NOT EXISTS

   SELECT i.id, i.file_name, i.total_votes 
     FROM _images i
    WHERE approved = 1 
      AND NOT EXISTS (SELECT NULL
                       FROM VOTES v
                      WHERE v.image_id = i.id
                        AND v.voter_id = ?)
 ORDER BY total_votes DESC 
    LIMIT ".($page*5).", 5

Использование NOT IN

  SELECT i.id, i.file_name, i.total_votes 
    FROM _images i
   WHERE approved = 1 
     AND i.id NOT IN (SELECT v.image_id
                      FROM VOTES v
                     WHERE v.voter_id = ?)
ORDER BY total_votes DESC 
   LIMIT ".($page*5).", 5

Рекомендуемое чтение:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...