簡體   English   中英

mysql選擇Where(子查詢)IN

[英]mysql select Where (subquery) IN

我有一個類型的mysql查詢

select some_value FROM table WHERE (subquery) IN ( values )

這似乎太慢了!

我有一個帶有訂單的mysql表,第二個帶有它們的相應處理狀態的表。 現在,我要顯示所有具有最后狀態代碼= 1的訂單。

表順序(ID =主鍵)

id | value
---+-------
1  +  10
2  +  12
3  +  14

表狀態(id =主鍵)

id | orderid | code
---+---------+-------
1  +  1      +  1
2  +  2      +  1
3  +  2      +  2
4  +  1      +  3
5  +  3      +  1

我的查詢是:

select order.id FROM order WHERE
( select state.code FROM state WHERE state.orderid = order.id ORDER BY state.id DESC LIMIT 0,1 )     IN ( '1' )

單個訂單處理大約需要15秒。 如何修改mysql語句以加快查詢處理時間?

更新

試試這個:

select s1.orderid
from state s1
left outer join state s2 on s1.orderid = s2.orderid
    and s2.id > s1.id
where s1.code = 1
    and s2.id is null

您可能需要在state.orderidstate.orderid索引。

SQL小提琴示例

CREATE TABLE state
    (`id` int, `orderid` int, `code` int)
;

INSERT INTO state
    (`id`, `orderid`, `code`)
VALUES
    (1, 1, 1),
    (2, 2, 1),
    (3, 2, 2),
    (4, 1, 3),
    (5, 3, 1)
;

查詢

select s1.orderid
from state s1
left outer join state s2 on s1.orderid = s2.orderid
    and s2.id > s1.id
where s1.code = 1
    and s2.id is null

結果

| ORDERID |
|---------|
|       3 |

在這種情況下,我想您可能會忘記order ,因為所有信息都保持state

SELECT x.id, x.orderid
FROM state AS x
WHERE x.code =1
AND x.id = (
SELECT max( id )
FROM a
WHERE orderid = x.orderid ) 

也許也可以通過將最后一個狀態直接放在order表中來更改您的CRUD ,這會更好

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM