mySQL - SELECT с использованием JOIN или вложенный SELECT (sub-select)?

Я пытаюсь написать SELECT в mySQL (и PHP), который будет извлекать все строки в таблице "Изображения", которые еще не были ранжированы определенным пользователем.

Это мои таблицы:

Таблица: изображения

+-----------+----------+-----------+----------+
| Index     | Rank_Good| Rank_OK   | Rank_Bad |
+-----------+----------+-----------+-----------
| 201       | 2        | 9         | 28       |
| 202       | 11       | 20        | 39       |
| 203       | 36       | 14        | 7        |
+-----------+----------+-----------+----------+

Таблица 2: WhoAlreadyClickedImg (не имеет индекса)

+------------+-----------------+-----------+
| ImageIndex | UserWhoRankedIt | RankGiven |
+------------+-----------------+-----------+
| 202        | 87              | OK        |
+------------+-----------------+-----------+
| 202        | 93              | Bad       |
+------------+-----------------+-----------+
| 204        | 93              | Good      |
+------------+-----------------+-----------+
| 203        | 94              | Bad       |
+------------+-----------------+-----------+

Каждый раз, когда пользователь оценивает изображение, таблица "Изображения" обновляется, и в таблицу "WhoAlreadyClickedImg" добавляется строка. (эта таблица не имеет индекса)

например, если пользователь оценил индекс изображения 202 как "ok", тогда столбец "Rank_OK" будет обновлен до (+1), а затем в таблицу "WhoAlreadyClickedImg" будет добавлена ​​новая строка:

Индекс изображения: 201 | UserWhoRankedIt: (идентификатор используемой сессии) | RankGiven: ОК

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

например, если я пользователь "93", единственное изображение, которое принесет выбор, будет "203"

ОБНОВЛЕНО:

Это запрос, который я использую (@eamonn):

ВЫБРАТЬ * ИЗ ИЗОБРАЖЕНИЙ, ГДЕ НЕ УКАЗАНО Индекс (ВЫБЕРИТЬ ImageIndex ОТ WhoAlreadyClickedImg, ГДЕ UserWhoRankedIt = 93);

но я получаю ошибку:

У вас есть ошибка в вашем синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы узнать правильный синтаксис для использования рядом с "Индекс НЕ ВХОДИТ" (ВЫБЕРИТЕ ImageIndex ОТ WhoAlreadyClickedImg ГДЕ UserWhoRankedIt'в строке 1

Я проверил свою систему:

  • Двигатель хранения: InnoDB

  • Версия базы данных MySQL: 5.5.33-29.3

  • обе таблицы теперь имеют индекс int(11), определенный как PRIMARY, auto_increment

может у кого-то есть идея?

3 ответа

Решение

Там это должно работать:

SELECT Images.Index 
       FROM Images 
       WHERE Images.Index NOT IN 
             (
                SELECT WhoAlreadyClickedImg.ImageIndex 
                     FROM WhoAlreadyClickedImg 
                     WHERE WhoAlreadyClickedImg.UserWhoRankedIt = 93
             );

Не забудьте добавить имена таблиц перед именем столбца.

SELECT * FROM Images WHERE Index NOT IN (SELECT ImageIndex FROM WhoAlreadyClickedImg WHERE UserWhoRankedIt = 93);

Простой подзапрос.

Ну, имя столбца Index является зарезервированным ключевым словом в MySQL. Вам следует изменить имя столбца индекса на Id или MainIndex. Смотрите эту ссылку: https://dev.mysql.com/doc/refman/5.6/en/keywords.html

Другой вариант - использовать имя таблицы внутри запроса select. Например:

SELECT * FROM Images WHERE Images.Index NOT IN (SELECT ImageIndex FROM WhoAlreadyClickedImg WHERE UserWhoRankedIt = 93);

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

Другие вопросы по тегам