2012-07-31 104 views
6

如何從MAX(ID), MIN(ID)獲取更多列MYSQL查詢?從該查詢MAX(ID) & MIN(ID)從MAX(ID),MIN(ID)MYSQL查詢獲取更多信息?

目前我得到的只有兩個值

SELECT MIN(ID), MAX(ID) FROM mytable WHERE mytable.series = 'white' ;

需要得到這樣的僞查詢:

SELECT column1, column2 
FROM mytable 
WHERE series = 'white' 
AND ID=Max(ID) 
'AND GET ME ALSO' 
WHERE series = 'white' 
AND ID=Min(ID);` 

它應該返回2行的列'系列'等於'白色'。

1st與第1列和第2列ID =最小(ID)。 對於ID = Max(ID),第二列與第一列和第二列。

但是如何?

回答

6

下面是使用UNION的方法:

SELECT column1, column2 
FROM mytable 
WHERE series = 'white' AND ID IN 
( 
    SELECT MIN(ID) FROM mytable WHERE series = 'white' 
    UNION 
    SELECT MAX(ID) FROM mytable WHERE series = 'white' 
) 

爲了獲得良好的性能上(series, id)添加一個組合索引。

或者另一個變化可能會有更好的表現:

(
    SELECT column1, column2 
    FROM mytable 
    WHERE series = 'white' 
    ORDER BY ID 
    LIMIT 1 
) 
UNION 
(
    SELECT column1, column2 
    FROM mytable 
    WHERE series = 'white' 
    ORDER BY ID DESC 
    LIMIT 1 
) 

這也將能夠使用組合指數(series, id)

+0

這工作,但需要1:39分鐘。對於+5000行的數據......這是正常的嗎? – Ash501 2012-07-31 17:19:55

+1

@ Ash501:這絕對不正常。你忘了添加索引嗎?我已經更新了我的答案,以包含索引建議。但是對於5000行,我認爲它應該比那個更快*甚至沒有索引*。您的數據庫服務器供電不足或負載過重。你能否更新你的問題來提及性能是一個問題,並且包含'SHOW CREATE TABLE ...'的輸出和'EXPLAIN SELECT'的結果? – 2012-07-31 17:20:16

+1

@ Ash501,這是因爲子查詢很慢,因爲MySQL必須爲每行執行它們。如果您設置了正確的索引,他的第二個解決方案應該更快。 – 2012-07-31 17:23:51

0

這正是像你說:

SELECT 
    column1, column2 
FROM 
    mytable as m, 
    (SELECT MIN(ID) as mid, MAX(ID) as xid 
    FROM mytable WHERE mytable.series = 'white' 
    ) t 
WHERE 
    m.ID = t.mid or m.ID = t.xid; 

的選擇括號中是內部的選擇,你可以使用,就像另一個表。

2

一個簡單的辦法:

SELECT a.column1, a.column2 
FROM mytable a 
JOIN (
     SELECT MIN(ID) AS minid, MAX(ID) AS maxid 
     FROM mytable 
     WHERE series = 'white' 
     ) b ON a.ID IN (b.minid, b.maxid)