Я пытаюсь написать 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
может у кого-то есть идея?
Там это должно работать:
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 * FROM Images WHERE Images.Index NOT IN (SELECT ImageIndex FROM WhoAlreadyClickedImg WHERE UserWhoRankedIt = 93);
Я думаю, что вы должны переименовать свой столбец, поскольку это сводит к минимуму вероятность ошибок в операторах SQL.