订单每天选择10行

时间:2009-07-18 07:11:00

标签: sql mysql

我有一个带有日期记录的数据库(时间戳) 我需要每天选择10条记录(每天还有更多记录) 并按几列排序......

该查询应该如何?

9 个答案:

答案 0 :(得分:4)

您必须每天在子查询中获取10条记录,并通过左连接将它们连接到主表,这样您每天最多可获得10条记录。 SQL看起来像这样:

SELECT t1.columns
FROM mytable t1 
  LEFT JOIN 
     (SELECT pk FROM mytable t2 
     WHERE t2.datecol = t1.datecol 
     ORDER BY t2.orderFor10Rows LIMIT 10) t3
  ON t1.pk = t3.pk
ORDER BY t1.anyOtherColumns

对于正确的MySQL语法不予保证,因为我不习惯它。

答案 1 :(得分:3)

在SQL Server 2005中按日期排序的每一天选择前10条记录

select * from 
(select *,ROW_NUMBER()
OVER
(PARTITION BY record.day order by record.day desc,record.score desc)
as row from record) 
as table1 where row < 11

现在,由于您的记录表没有日期列,因此您需要使用datepart(day, record.date)而非record.day

之类的内容

这应该可以解决您的问题

答案 2 :(得分:2)

如果您只需要十行 - 任意十行,您不关心哪一行,并且无法保证它们是随机的,您可以使用LIMIT子句。例如:

SELECT whatever
  FROM tablename
  WHERE datecol = '2009-07-13'
  LIMIT 10

那会给你十排。它取决于MySQL十。您可以使用ORDER BY或其他WHERE项来挑选某个10.例如,这是最近的10个:

SELECT whatever
  FROM tablename
  WHERE datecol = '2009-07-13'
  ORDER BY timecol DESC
  LIMIT 10

LIMIT被记录为SELECT syntax

的一部分

答案 3 :(得分:2)

如果您使用的是编程语言而不是直接查询服务器,则可以为每天的“Limit 10”或“Top 10”联合动态构建查询。效率不是很高,但它至少可以工作,并且以后很容易调试和修改。您甚至可以通过服务器中的SP动态创建查询,并直接从那里开始工作。

答案 4 :(得分:1)

如果您正在使用MySQL,并且该列的类型为timestamp。 您需要将其转换为日期,然后将其与您要比较的日期进行比较。

  

SELECT * FROM tablename tName

     

,其中

     

日期(timestampFieldName)=日期('2009-07-08')

     

限制0,10

答案 5 :(得分:1)

这是一个可能的解决方案,但它需要在sql之外做一些工作。这是一个电影列表的实例。在此之后您需要做的就是拉出连续列表的前10部电影。

SELECT Movie_Release_Year, GROUP_CONCAT( Movie_Title
ORDER BY Movie_Title ) 
FROM movies
GROUP BY Movie_Release_Year

有关详细信息,请参阅Group Concat

答案 6 :(得分:1)

在看了Baron Schwarz的(非常优秀的)xaprb博客之后,http://www.xaprb.com/blog/2006/12/02/how-to-number-rows-in-mysql/ 我想知道用户定义变量的使用是否可以在这里工作。

select hiredate, ename, sal
from ( select hiredate, ename, sal,
       @num := if(@hiredate = hiredate, @num + 1, 1) as row_number,
       @hiredate := hiredate as dummy
     from emp_temp
) as x
where row_number < 3
order by hiredate, ename, sal

我只是尝试了上面的小数据集,但似乎每个hiredate只返回两个记录。据我所知,从有限的测试中可以扩展到更大的数据集。 (由于Mysql正在创建临时表,因此大型数据集中可能存在性能问题)

答案 7 :(得分:1)

实际上它更像是这样,我把订单放错了日期。

这里我们假设记录表中有一个日期时间字段和一个用于对记录进行排名的分数字段。

SELECT      *
FROM            (SELECT *, ROW_NUMBER() OVER (PARTITION BY datepart(year, Record.date), datepart(month, Record.date), datepart(day, Record.date)
ORDER BY Record.score desc) AS row
FROM            Record ) AS table1
WHERE        row < 11
ORDER BY datepart(year, Record.date) desc, datepart(month, Record.date) desc, datepart(day, Record.date) desc

答案 8 :(得分:1)

老问题,但是我发现了使用会话变量的非常好的答案(不是我自己的答案)。

考虑表

$(".textbox-" + rowid).val()

以下查询将根据当天的计数选择每天前10名参数

CREATE TABLE `report` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`reportDate` int(11) DEFAULT NULL,
`count` int(11) DEFAULT NULL,
`parameter` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `INDEX1` (`reportDate`,`parameter`,`count`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;