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.