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

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

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

$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

Ответы [ 3 ]

0 голосов
/ 10 ноября 2018

Вы можете сделать это с помощью 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);
0 голосов
/ 10 ноября 2018

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

$check = mysqli_query($db, 'SELECT `item` FROM
                    (SELECT `item` 
                    FROM `used` 
                    ORDER BY `id` DESC 
                    LIMIT 10) as useditems
                    WHERE `item` = ' . $id );
0 голосов
/ 10 ноября 2018

Звучит так, будто вы хотите проверить, был ли элемент $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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...