2014-11-04 79 views
1

我有這個表mytable中的最大項:行的MySQL的SELECT id其中最偉大的幾列

+----+--------------------------------------+ 
| id | date1  | date2  | date3  | 
+----+--------------------------------------+ 
| 1 | 2014-01-08 | NULL  | NULL  | 
| 2 | 2014-05-09 | NULL  | NULL  | 
| 3 | 2014-06-13 | NULL  | NULL  | 
| 4 | NULL  | 2014-03-24 | NULL  | 
| 2 | NULL  | NULL  | 2014-08-15 | 
| 4 | 2014-01-01 | NULL  | NULL  | 
| 1 | 2014-02-15 | NULL  | NULL  | 
| 3 | NULL  | 2014-12-06 | 2014-10-12 | 
| 4 | 2014-08-06 | NULL  | NULL  | 
| 2 | 2014-05-22 | NULL  | NULL  | 
+----+--------------------------------------+ 

現在,我嘗試有一個結果如下選擇:

id max_date1 max_date2 max_date3 
--------------------------------------------- 
| 3 | 2014-08-06 | 2014-12-06 | 2014-10-12 | 

這意味着每個日期列的MAX以及MAX結果中GREATEST所在行的ID。

查詢,這給我帶來近到解決方案是這樣的:

SELECT 
    id, max(date1), max(date2), max(date3), GREATEST(
    IFNULL(max(date1), 0), 
    IFNULL(max(date2), 0), 
    IFNULL(max(date3), 0)) AS maxdate 
FROM table1 

但ID我得到的,不是預期的一個。我怎樣才能找出哪個列有maxdate,以便我可以找出附件ID?

see fiddle

+0

你嘗試子查詢?可能是那個應該工作 – Siva 2014-11-04 15:06:16

+0

好吧,我試了很多,子查詢也是。但你必須知道我是一個絕對的SQL初學者:) – MaggusK 2014-11-04 15:23:46

+0

你有很多專家的答案....希望你能解決你的問題 – Siva 2014-11-04 15:27:53

回答

0

辦法做到這將是存儲在用戶定義的變量的日期。那麼你可以用它來拉出ID爲最大日

SET @A := (SELECT GREATEST(
        IFNULL(max(date1), 0), 
        IFNULL(max(date2), 0), 
        IFNULL(max(date3), 0) 
       ) FROM table1 
      ); 
-- here i JOIN a select that pulls out the correct id 
SELECT t.joinid, max(`date1`), max(`date2`), max(`date3`) 
FROM table1 
JOIN 
( SELECT id as joinid 
    FROM table1 
    WHERE @A IN -- WHERE my MAX date is in 
    (
     SELECT date1 -- here the UNION is just putting all of the dates into one column to compare one date with 
     UNION ALL SELECT date2 
     UNION ALL SELECT date3 
    ) 
) t -- every table must have an alias 

FIDDLE DEMO

+0

嘿傢伙,你搖滾!你似乎是一個SQL怪胎。查詢爲我帶來了解決方案,雖然我仍然希望找到一個easyer的方式... – MaggusK 2014-11-04 15:40:41

+0

@MaggusK謝謝,我只知道從我在這裏知道的東西:) – 2014-11-04 15:50:34

+0

不過,我想更好地理解這個查詢。這個變量很清楚。我必須閱讀關於聯盟。但是'temp'呢?這是一個由語法暫時創建的表嗎? – MaggusK 2014-11-04 15:51:17

0

請注意,當您在查詢中使用MAX,MIN等時,您實際上失去了該值與其他值之間的連接。這裏的解決方案可能有點不同,那麼你的期望是什麼,但它只是找到3個字段的最大值,並將它們作爲行進行比較。

(select id,'date1' as col,(date1) as d from table1 order by d desc limit 1) 
UNION 
(select id,'date2' as col,(date2) as d from table1 order by d desc limit 1) 
UNION 
(select id,'date3' as col,(date3) as d from table1 order by d desc limit 1) 
ORDER BY d desc 
+0

謝謝大衛。不是我的解決方案,但你帶我進一步理解SQL :) – MaggusK 2014-11-04 15:53:46

0
SELECT 

    (
    CASE 
    WHEN max(t1.date1) >= max(t2.date2) && max(t1.date1) >= max(t3.date3) THEN 
    t1.id 
    WHEN max(t2.date2) >= max(t1.date1) && max(t2.date2) >= max(t3.date3) THEN 
    t2.id 
    ELSE 
    t3.id 
    END) AS highest_data_row_id, 
    max(t1.date1), 
    max(t2.date2), 
    max(t3.date3) 

FROM 
    table1 t1, table1 t2, table1 t3 
+0

嘿Andrzej,這看起來對我來說合乎邏輯,但遺憾地拋出一個語法錯誤(至少在SQL小提琴)。另外,如果我在最後一個查詢行中將'table'重命名爲'table1':( – MaggusK 2014-11-04 15:37:17

+0

將所有表格重命名爲表1 :)在此處粘貼您的錯誤... – 2014-11-04 15:41:05

+1

我爲您修復了這個錯誤..在'highest_data_row_id'後面缺少逗號' – 2014-11-04 15:41:50

0
SELECT 
    id, max(date1), max(date2), max(date3), GREATEST(
    IFNULL(max(date1), 0), 
    IFNULL(max(date2), 0), 
    IFNULL(max(date3), 0)) AS maxdate, 
    (select id from 
    (
     select id, max(date1) as temp from table1 group by 1 
     union 
     select id, max(date2) as temp from table1 group by 1 
     union 
     select id, max(date3) as temp from table1 group by 1 
    ) temptable order by temp desc limit 1) as ok_id 
FROM table1; 
+0

不建議這樣做時間..在這方面的開銷將是巨大的 – 2014-11-04 15:49:40

0

如果我理解正確:

http://sqlfiddle.com/#!8/e4f3f/2

SELECT id, max(date1) As max_date1, max(date2) As max_date2, max(date3) As max_date3 FROM table1 GROUP BY id