MySQL LIMIT игнорируется в коррелированном подзапросе - PullRequest
0 голосов
/ 13 октября 2018

У меня есть 2 таблицы: orders и items.Каждый order имеет много items.Каждый item имеет type.Я хочу запрос, который возвращает все заказы, у которых элемент НАИБОЛЕЕ ПОСЛЕДНИЙ имеет type = 2

. Я могу построить коррелированное предложение EXISTS, которое фильтрует заказы, где ЛЮБОЙ из элементов имеет type=2

SELECT * FROM orders 
WHERE EXISTS(
    SELECT NULL 
    FROM items 
    WHERE order_id = orders.id
    AND type=2 
    ORDER BY id DESC 
    LIMIT 1
)

но, судя по всему, я не могу сформулировать запрос, чтобы отфильтровать заказы для тех, чей элемент MOST RECENT имеет тип = 2

Я также пробовал каждую комбинацию JOIN, чтобы попытаться преодолетьпредложение LIMIT игнорируется.Ничего не работает.

Мне кажется, это должно быть просто.

1 Ответ

0 голосов
/ 13 октября 2018

Возможно, вам не нужно использовать предложение Exists().Вы можете напрямую сравнить результат коррелированного подзапроса со значением (2) в Where.Я предполагаю определение "ПЕРВЫЙ предмет" из вашего запроса (ORDER BY id DESC LIMIT 1).Попробуйте следующий запрос:

SELECT o.* 
FROM orders AS o 
WHERE 2 = (SELECT type 
           FROM items 
           WHERE order_id = o.id 
           ORDER BY id DESC LIMIT 1)

  • В качестве альтернативы вы можете использовать коррелированный подзапрос в самом предложении Select, чтобы получитьпервое значение типа элемента для заказа.
  • Затем вы можете использовать этот результат в Производной таблице и отфильтровать случаи, когда первый тип элемента = 2.

Попробуйте выполнить следующее:

SELECT dt.* 
FROM 
(
 SELECT o.*, 
        (SELECT type 
         FROM items 
         WHERE order_id = o.id 
         ORDER BY id DESC LIMIT 1) AS first_item_type
 FROM orders AS o 
) AS dt 
WHERE dt.first_item_type = 2
...