簡體   English   中英

選擇單個最大值

[英]Selecting single max values

假設我需要像這樣從幾個表中提取數據:

item 1 - from table 1
item 2 - from table 1
item 3 - from table 1 - but select only max value of item 3 from table 1
item 4 - from table 2 - but select only max value of item 4 from table 2

我的查詢非常簡單:

select
    a.item 1,
    a.item 2,
    b.item 3,
    c.item 4
from table 1 a
left join (select b.key_item, max(item 3) from table 1, group by key_item) b on a.key_item = b.key_item
left join (select c.key_item, max(item 4) from table 2, group by key_item) c on c.key_item = a.key_item

我不確定從表中僅提取單個最大項目的方法是否最有效。 假設兩個表都超過一百萬行。 我的實際sql永遠使用此sql設置運行。

編輯:我更改了group by子句以反映所作的評論。 我希望這現在有意義嗎?

最好的選擇是在table1table2上添加索引,如下所示:

ALTER TABLE table1
ADD INDEX `GoodIndexName1` (`key_item`,`item3`)

ALTER TABLE table2
ADD INDEX `GoodIndexName2` (`key_item`,`item4`)

這將允許您使用MySQL文檔中描述的查詢來查找包含按組的最大值的行,這似乎是您要查找的行。

您原始的(編輯過的)查詢應該可以工作:

select
    a.item1,
    a.item2,
    b.item3,
    c.item4
from table1 a
LEFT OUTER JOIN (
    SELECT 
    b.key_item, 
    MAX(item3) AS item3
    FROM table1
    GROUP BY key_item
) b 
ON a.key_item = b.key_item
LEFT OUTER JOIN (
    SELECT 
    c.key_item, 
    MAX(item4) 
    FROM table2
    GROUP BY key_item
) c 
ON c.key_item = a.key_item

如果在添加索引后執行緩慢,請嘗試以下操作:

SELECT
    a.item1,
    a.item2,
    b.item3,
    c.item4
FROM table1 a
LEFT OUTER JOIN table1 b
ON b.key_item = a.key_item
LEFT OUTER JOIN table1 larger_b
ON larger_b.key_item = b.key_item
AND larger_b.item3 > b.item_3
LEFT OUTER JOIN table2 c
ON c.key_item = a.key_item
LEFT OUTER JOIN table2 larger_c
ON larger_c.key_item = c.key_item
AND larger_c.item4 > c.item4
WHERE larger_b.key_item IS NULL
AND larger_c.key_item IS NULL

(我僅對表名和列名進行了少許修改,以使其符合正確的MySQL語法。)

我一直在使用使用上述結構的查詢,並且它們使用我提供的索引非常有效地執行。

就是說,通常我在bc表上使用INNER JOINs,但是我不明白為什么您的查詢應該有任何問題。

如果確實仍然遇到性能問題,請報告每個表的key_item列的數據類型,就好像您嘗試連接不同的數據類型一樣,通常會得到較差的性能。

暫無
暫無

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

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