2013-06-24 62 views
0

所以我有一個私人消息模型,其列有:sender_idrecipient_id,contentcreated_at如何從按日期排序的SQL查詢中選擇1列?

我想選擇我有留言的最後5個收件人。但是,我無法弄清楚如何縮小列。

我當前的查詢是這樣的:

SELECT DISTINCT recipient_id, created_at FROM private_messages WHERE sender_id = :user_id ORDER BY created_at DESC LIMIT 5 

我無法擺脫的created_at列,因爲它是必要的ORDER BY。我必須錯過一些東西,但我不完全確定它是什麼。

+0

我想通了,使用子查詢的做這件事的真正哈克替代方法。對於任何人想知道的,這是我做的:SELECT DISTINCT recipient_id FROM(SELECT recipient_id FROM private_messages WHERE sender_id =:user_id ORDER BY created_at DESC)AS收件人LIMIT 5 – Dasun

回答

0

您是否嘗試過類似下面:

SELECT TOP 5 recipient_id 
FROM private_messages 
WHERE sender_id = :user_id 
GROUP BY recipient_id 
ORDER BY created_at DESC 

我相信你並不需要在你的選擇created_at BY子句中使用它的順序。這可能取決於你使用的是哪個數據庫系統,在SQL服務器中它會允許這樣做。

+0

我使用PostGreSQL ..語法錯誤:PG :: Error:ERROR :在「5」處或附近的語法錯誤 – Dasun

+0

是在PostGreSQL中刪除前5並在最後添加限制5。 – JanR

+0

與其他響應相同的錯誤:列「private_messages。created_at「必須出現在GROUP BY子句中或用於聚合函數 – Dasun

0

試試這個:SELECT DISTINCT recipient_id,created_at FROM private_messages WHERE SENDER_ID =:USER_ID GROUP BY recipient_id ORDER BY created_at DESC LIMIT 5

+0

我收到此錯誤:列」private_messages.created_at「必須出現在GROUP BY子句中或用於聚合函數 – Dasun

+0

distinct和group by將執行在這種情況下,同樣的事情,如果你做了一個組,你將不得不按照你的例子中的ID和日期進行分組。 – JanR

+0

嘗試刪除截然不同,因爲使用group by子句 – passion

2

....我無法擺脫的created_at列,因爲它是必要的ORDER BY。

列號,以便通過cluase沒有必要存在於SELECT列列表。 您可以省略查詢的SELECT列表中的created_at列。其餘的查詢將正常工作。

檢查此SQL FIDDLE其中顯示上述事實。

+0

奇怪,我拿出DISTINCT和created_at,它工作得很好。但是,當我添加DISTINCT回來時,我得到這個錯誤:PG ::錯誤:錯誤:對於SELECT DISTINCT,ORDER BY表達式必須出現在選擇列表中 – Dasun

+0

對於您提出的問題,請不要求distinct。 –

+0

不完全確定,如果這是正確的,我可以給同一個用戶5次消息。沒有明確的,我會得到那個接收者ient_id 5次。 – Dasun

0

嘗試: SELECT recipient_id FROM(SELECT recipient_id,MAX(created_at)作爲created_at FROM private_messages WHERE SENDER_ID =:USER_ID GROUP BY recipient_id)一個ORDER BY created_at DESC LIMIT 5;

0

您不能忽略該列。這已被添加到SQL標準前一段時間。

for SELECT DISTINCT, ORDER BY expressions must appear in select list

here引用(來自湯姆泳道消息。)

there's actually a definitional reason for it. Consider

SELECT DISTINCT x FROM tab ORDER BY y;

For any particular x-value in the table there might be many different y
values. Which one will you use to sort that x-value in the output?

Back in SQL92 they avoided this problem by specifying that ORDER BY
entries had to reference output columns. SQL99 has some messy verbiage that I think comes out at the same place as our restriction

例如,Oracle不強制此規則(10g或11g)。

0

試試這個

WITH t AS (SELECT max(created_at) AS created_at, recipient_id FROM messages 
GROUP BY recipient_id ) 

SELECT created_at, recipient_id FROM t ORDER BY created_at DESC LIMIT 5