2013-07-08 117 views
0

我正在使用一個系統進行自我更新,在此係統中,我嘗試選擇最高500並列出它們。然而,問題是我通過一個varchar來對它進行排序,該日期格式爲2013-07-08,這是一個遺留問題,暫時我不能將其更改爲適合簡單排序的正確日期。每個ID只選擇一個條目

我的問題是,我如何只選擇以下3個假裝結果中的一個?

id |值| ownerid |日期

1| 21300 | 1  | 2013-07-08 
2| 21300 | 1  | 2013-07-08 
3| 21300 | 1  | 2013-07-08 

我需要做什麼是選擇從每個OWNERID,這是一個最高值一個條目(如果它並不真正的問題只是,這只是其中一個條目時,都一樣! )

這是使用一個mysql數據庫與PDO作爲數據庫層。

感謝任何和所有的幫助!

+0

純SQL,'GROUP BY「date''彈簧想到 – Anigel

+0

你必須決定,你需要它此行的?無論如何,您可以將GROUP BY語句添加到您的查詢中 – FSou1

+0

嗯,我在考慮對它進行排序以僅選擇最新的ID,以便始終顯示最新的信息 – Hultin

回答

0

使用子查詢與GROUP BY得到一個特定的ID每天(最大值或最小值爲例)然後JOIN,對錶,以獲得其餘的細節:

SELECT a.id, a.value, a.ownerid, a.date 
FROM SomeTable a 
INNER JOIN 
(
    SELECT date, MAX(id) AS MaxId 
    FROM SomeTable 
    GROUP BY date 
) b 
ON a.date = b.date 
AND a.id = b.MaxId 

改良版獲得每天最高價值的行。由於值不是唯一的,我已經做了進一步的子選擇以獲得最高值的最高ID。沒有這個,你可能會得到多天返回的行。如果其他值的可能性都不相同,則可以使用DISTINCT刪除倍數,但通常不可能確定這個倍數。

SELECT a.id, a.`value`, a.ownerid, a.`date` 
FROM SomeTable a 
INNER JOIN 
(
    SELECT `date`, MAX(`value`) AS MaxVal 
    FROM SomeTable 
    GROUP BY `date` 
) b 
ON a.`date` = b.`date` 
AND a.`value` = b.MaxVal 
INNER JOIN 
(
    SELECT `date`, `value`, MAX(id) AS MaxId 
    FROM SomeTable 
    GROUP BY `date`, `value` 
) c 
ON b.`date` = c.`date` 
AND b.MaxVal = c.`value` 
AND a.id = c.MaxId 
+0

我通過查看你的代碼意識到我並沒有真正清楚。爲了清晰起見更新主帖。 – Hultin

+0

更新的回覆,以適應 – Kickstart

+0

我看到這個查詢幾乎做它應該做的,但它每天只選擇一個條目。但是,我的目標是選擇按價值desc排序的最後500個條目。我不確定我是否有能力進一步表達問題。我正在玩弄你的代碼,但要更好地學習它,並且有一些經驗,我可能會解決它。但是,感謝迄今爲止的幫助! – Hultin

0
SELECT * 
FROM [table] 
ORDER BY STR_TO_DATE(yourdatefield, '%m/%d/%Y') DESC 
LIMIT 5 
+0

這不會悲傷地工作,它仍然會返回多個項目每個ownerid&日期。這是我正在使用的「今日500強」風格清單。 – Hultin