2015-10-21 130 views
0

我想選擇給定字段中具有最小值的子查詢的所有行。下面是到目前爲止,我已經試過了技術的一些玩具例子:MySQL選擇具有最小值的所有子查詢行

-- 1. 
select 
    id, min(foo) 
from 
    (select 1 AS id, 2 AS foo 
    union select 2 AS id, 2 AS foo 
    union select 3 AS id, 3 AS foo) a; 

-- 2. 
select 
    min(foo) 
from 
    (  
      select 1 AS id, 2 AS foo, 0 AS const 
    union select 2 AS id, 2 AS foo, 0 AS const 
    union select 3 AS id, 3 AS foo, 0 AS const) a 
group by const; 

-- 3. 
select 
    id 
from 
    (select 1 AS id, 2 AS foo 
    union select 2 AS id, 2 AS foo 
    union select 3 AS id, 3 AS foo) a 
where id = (select id from a where min(foo) = foo); 

-- 4. 
select 
    id 
from 
    (select 1 AS id, 2 AS foo 
    union select 2 AS id, 2 AS foo 
    union select 3 AS id, 3 AS foo) a 
where foo = (select min(foo)); 

-- 5. 
select r.* 
from 
(
    select min(foo) t 
    from 
     (select 1 AS id, 2 AS foo 
     union select 2 AS id, 2 AS foo 
     union select 3 AS id, 3 AS foo) a 
) m 
INNER JOIN a ON m.t = r.foo; 

我工作的實際查詢是類似的例子,因爲它是由幾個較小的查詢聯合在一起。此處的總體目標是基於與其相連的關聯表k的字段在中央表中查找一行,其中k是最高優先級表。結果是來自類似(但不同的表)的行的一種樹形視圖。

我已經提到過這個,所以如果有人能看到我以迂迴的方式討論這個問題,他們可以在更大的圖景上闡明一些事情。但現在我的角度是通過在子查詢中的字段取最小值來選擇。

回答

0

使用order bylimit

select t.* 
from t 
order by foo 
limit 1; 

注:這只是返回一行具有最小,即使有重複。 t是您的子查詢或表格。

如果你想所有的人,那麼你需要包括兩次表定義:

select t.* 
from t 
where t.foo = (select min(t2.foo) from t t2); 
+0

「你需要包括表定義兩次」 - 這就是我所擔心的。我的子查詢是一個野獸。 –

+0

@JeffCarpenter。 。 。第一種方法沒有這個限制。如果你需要重複,那麼視圖是另一種可能性。 –