2015-11-08 123 views
0

說我需要從幾個表中提取數據,就像這樣:選擇單個最大值

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安裝程序永遠運行。

編輯:我改變了小組的條款,以反映評論。我希望現在有點意義?

+0

您應該使用您正在運行的實際SQL編輯您的問題。你寫的查詢沒有意義。您正在聚合一組列,然後選擇其他列。 –

+0

我的實際SQL完全像這樣,表和列的名稱已更改。爲什麼查詢沒有意義?我只是希望獲得特定項目的最大值而不是整行,那麼爲什麼要聚合整個行? – user2022284

+2

你能告訴我們樣本數據和慾望輸出嗎? –

回答

1

最好的辦法是對table1table2添加索引,如下所示:

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

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

這將允許您使用queries as described in the MySQL documentation尋找行控股集團明智的最大值,這似乎成爲你正在尋找的東西。

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

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語法。)

我使用上述結構的查詢一直工作,並且它們非常高效地執行inde xes就像我提供的那個。

也就是說,通常我在bc表上使用INNER JOIN,但我不明白爲什麼你的查詢應該有任何問題。

如果仍然遇到性能問題,請爲每個表報告key_item列的數據類型,就好像您試圖加入不同的數據類型一樣,通常您的性能會很差。

+0

精彩的@Willem將於明天上午執行並報告。謝謝 – user2022284

+0

第二個解決方案工作。它比第一個要快得多。謝謝。我想了解一下這種方法 - 一種學習體驗。我得到了關於將表加入自身並比較我們正在尋找的最大值的字段的部分。我沒有得到爲更大的_c.key_item指定空值的部分。這到底是什麼? – user2022284

+0

到'larger_c'表的連接是爲了連接所有大於'c'表中記錄的記錄。如果我們然後指定'greater_c'記錄不應該存在,那麼通過要求非空列爲null(在這種情況下爲'key_item'列),那麼我們只從'c'表中獲得記錄沒有更大的'item4'值。也就是說,具有item4最大值的記錄。 –

0

我對你的版本做了一些修改,也許它現在會返回你想要得到的結果。

select item 1, item 2, max3, max4 from 
(
select 
    item 1, 
    item 2, 
    1 as max1, 
    1 as max2 
from table 1)a 
left join (select 1 as max1, max(item 3) as max3 from table 1) b on a.max1 = b.max1 
left join (select 1 as max2, max(item 4) as max4 from table 2) c on c.max2 = a.max2 
) 
+0

我對「1 as max1」和「1 as max2」有點困惑。表1和2中是否有這些鍵?如果不是,我如何在每個表中使用主鍵來加快速度 - 假設表1和表2共享一個鍵。 – user2022284

+0

這不起作用。爲所有行拉取一個最大值。 – user2022284