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

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

0

Решение

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

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

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

1

Другие решения

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

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

1

Ну, имя столбца 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.

1
По вопросам рекламы [email protected]