2011-07-12 41 views
-1

我們在MySQL中有一個表,其中一列是date_addedMySQL - 如何從此表中選擇並按Date_Added排序?

對於每個date_added可能有若干記錄。

我需要出示網頁上,它顯示了按日期排序下降了行,但最多隻有10%的時間。

輸出示例:

Jun 1 
item 
item 
item 
item 
item 
item 
May 31 
item 
item etc 

是否有一種方式來運行MySQL中的查詢將獲取這樣的結果嗎?

+0

其實我沒有得到任何地方。我正在考慮使用GROUP,但它不能解決問題。我可以按日期對其進行排序,但是如何確保每個日期最多隻有10條記錄被提取 –

+4

您的表格模式是什麼?請在您的問題 –

+0

中發佈您在Web應用程序中使用的語言?它是Java還是.NET或其他?請指定編碼語言,可能是我們可以幫助的 – Rakesh

回答

0

我不知道我準確地瞭解你在做什麼之後,但你可以嘗試:

SELECT * FROM myTable GROUP BY date_added DESC LIMIT 0,10; 
+0

如果每行都有不同的日期值,但是很多行具有完全相同的日期值,所以它不會返回所有行。例如,我們在6月18日添加了30行,但由於小時和分鐘值的差異,它只返回2行。 –

+1

這是否會將總結果限制爲10或每個'date_added'的結果爲10?我懷疑它的前... – Nivas

+1

我認爲這將限制總成績分至10 –

1
SELECT * FROM records WHERE date_added in (
    SELECT date_added FROM dates ORDER BY date_added DESC 
    ) 

向我有限的知識的程度,則不能選擇各只有10行日期。您需要在應用的業務邏輯中強制執行此限制。

+1

'ORDER BY'在子選擇不影響該命令從一個更高級別的查詢返回。 –

0

不能與查詢來實現,因爲據我所知。唯一的解決辦法是將這個邏輯放入網頁的代碼中。

確保記錄是通過日期排序。

在PHP中,其中一個方案是:

foreach ($rs as $row) 
{ 
    if ($tmp_date != $row->date_added) { $counter = 0; } 

    if ($counter <= 10) { 
     echo $row->yourinfo; //Whatever you want echoed from your recordset    
    } 

    $counter++; 
    $tmp_date = $row->date_added; 
} 
+0

是的,實際上我們已經在代碼中做到了。只是想知道在mysql中是否有一種有效的方法。 –

+0

好吧,如果你找到一個,請告訴我! ;) – Rick

0

不知道有關性能(可能不是很好):

SELECT m.* 
FROM 
    myTable AS m 
WHERE m.id IN 
     (SELECT ms.id 
      FROM myTable AS ms 
      WHERE ms.date_added = m.date_added 
      ORDER BY ms.something ASC   --- whatever (ASC or DESC) 
      LIMIT 10 
     ) 
ORDER BY m.date_added 
     , m.something 

你也可以試試這個:

SELECT m1.* 
FROM myTable AS m1 
    JOIN myTable AS m2 
    ON m2.date_added = m1.date_added 
    AND m2.id <= m1.id     --- this could also be: 
             --- m2.someField <= m1.someField 
GROUP BY m1.id 
HAVING COUNT(*) <= 10 
ORDER BY m.date_added 

或變化:

SELECT m1.* 
FROM myTable AS m1 
    LEFT JOIN myTable AS m2 
    ON m2.date_added = m1.date_added 
    AND m2.id < m1.id    
GROUP BY m1.id 
HAVING COUNT(*) < 10 
ORDER BY m.date_added 
0
SET @rank:=0; 
select TTT.f1, TTT.value 
from 
(select TT.f1, TT.value,TT.c, 
@rank:[email protected]+1 as rnk, 
case when @rank>=TT.c then @rank:=0 end as dummy 
from (
select T.f1, T.value, cnt.c 
from t2 T, (select f1, count(*) as c from t2 group by f1) cnt 
where cnt.f1 = T.f1 
order by T.f1 asc, T.value desc) TT) TTT 
where TTT.rnk<=10 

其中f1是「日期」字段和value是「項目」字段

相關問題