Как я могу проверить, существует ли значение в последних N строках другой таблицы?

used содержит список использованных предметов. Я не хочу, чтобы этот предмет снова использовался, если он был одним из последних 10 использованных предметов.

Из некоторого поиска в Google кажется, что мне нужен подзапрос, но я не могу заставить его работать. Вот что я пробовал до сих пор

$check = mysqli_query($db, 'SELECT `id`
FROM (
SELECT `id`
FROM `used`
ORDER BY `id` DESC
LIMIT 10)
WHERE `item` = ' . $id);

До этого я использовал следующее

$check = mysqli_query($db, 'SELECT `id`
FROM `used`
WHERE `item` = ' . $id . '
ORDER BY `id` DESC
LIMIT 10);

Тем не менее, кажется, что это только ограничивает результаты на 10, так что всегда будет возвращаться true если предмет использовался даже за пределами последних 10

0

Решение

Похоже, вы хотите проверить, если предмет $id был в последних 10 пунктах в used Таблица. Этот запрос должен сделать это:

$check = mysqli_query($db, "SELECT $id NOT IN (SELECT item
FROM used
ORDER BY id DESC
LIMIT 10)");

Этот запрос вернется 1 если значение $id не было в последних 10 значениях item в used стол или 0 иначе.

Для версий MySQL, которые не поддерживают LIMIT в IN подзапросы, вы можете использовать LEFT JOIN как в этом запросе, который вернет тот же результат:

SELECT IF(b.item IS NULL, 1, 0)
FROM used a
LEFT JOIN (SELECT item
FROM used
ORDER BY id DESC LIMIT 10) b ON b.item = a.item
WHERE a.item = $id
2

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

Вы можете сделать это с помощью JOIN:

$check = mysqli_query($db, 'SELECT u.id
FROM used AS u
JOIN (
SELECT id
FROM used
ORDER BY id DESC LIMIT 10) AS ub
USING (id)
WHERE item = ' . $id);
1

Это работает, если ваша версия не поддерживает LIMIT & IN / ALL / ANY / SOME subquery «:

$check = mysqli_query($db, 'SELECT `item` FROM
(SELECT `item`
FROM `used`
ORDER BY `id` DESC
LIMIT 10) as useditems
WHERE `item` = ' . $id );
1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector