我有一个带有日期记录的数据库(时间戳) 我需要每天选择10条记录(每天还有更多记录) 并按几列排序......
该查询应该如何?
答案 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;