2014-01-24 79 views
0

我有工作像這樣(MySQL的)查詢:如何使用不帶子查詢的列的MAX過濾SQL查詢?

查詢:

SELECT a, b, c, d FROM xTable WHERE d=(
    SELECT MAX(d) FROM xTable WHERE uid=1 
) AND c=0 

樣品:

--xTable-- 
| a | b | c | d | uid | 
| 30 | str | 20 | 32 | 1 | 
| 36 | abc | 0 | 32 | 1 | 
| 20 | ... | 40 | 33 | 1 | 
| 19 | dsi | 0 | 34 | 1 | 
| 68 |aeasd| 0 | 34 | 1 | 
| 112 |3eids| 224 | 34 | 1 | 

我只想用最大d(34)的行uid = X,但只有c = 0的那些。

有沒有辦法複製這個查詢沒有子查詢?

+0

子查詢有什麼問題? – peterm

+0

我將在一個龐大的數據庫中應用查詢,這個數據庫可能會同時發生許多插入操作,而且有些人說這些子查詢可能會在這些類型的應用程序中導致競爭條件,我應該避免它們。我不確定,但比對不起更安全。所以,我正在尋找替代品。 – Macmod

+1

如果沒有正確的DDL和期望的結果集,我無法完全理解你的結果,但也許你應該看看事務。 – Strawberry

回答

0

可以改寫成加入,但我不明白爲什麼會改善什麼(雖然MySQL的有限的查詢優化你永遠不知道...)

SELECT t1.a, 
     t1.b, 
     t1.c, 
     t1.d 
FROM xTable t1 
    JOIN (
    SELECT MAX(d) as max_d 
    FROM xTable 
    WHERE uid=1 
) t2 ON t2.max_d = t1.d 
WHERE t1.c=0 
+0

我認爲這將使用子查詢...... – Macmod

+1

@Macmod:它不是子查詢,它是派生表。 –

0

我dont't知道這會幫助你,但是由於你擔心的是由於頻繁插入而導致數據庫更改,你可以嘗試下面的解決方案,通過事先選擇max來消除獲得最大值的活力,並將其用作比較。它會在您選擇啓動查詢的位置獲得最大的行數。

with m as (select max(d) as d from xTable) select a, b, c, d from xTable where d = (select d from m) ;

所以在這裏,你有你的最大固定爲當前查詢。