2011-07-12 121 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是“项目”字段

相关问题