2013-10-21 58 views
-3

我在想如何让SQL抓住我想要的信息。我无法找到答案。我需要制作SQL,它可以在48小时内从我的表格中获取6个最多下载的记录并按时间排序。我的表看起来像SQL选择6行按时间排序

这是我的表看起来像:http://puu.sh/4VL9z.png

所以查询应该抓住唯一行(通过IP,不应该有相同downloader_ip)48小时内,然后抢只有6流行行通过下载进行排序并通过“modification_id”进行显示。应该有6个不同的“modification_id”。

那么如何让SQL如此呢?

编辑

我会想象,如果我有行:

| id | modification_id | time | file_name | downloader_ip | 

| 1 | 320 | 1382368921 | name.rar | 127.01.015.14| 

| 2 | 322 | 1382368925 | name.rar | 127.02.015.14 | 

| 3 | 325 | 1382368926 | name.rar | 127.03.015.14 | 

| 4 | 326 | 1382368928 | name.rar | 127.04.015.14 | 

| 5 | 328 | 1382368930 | name.rar | 127.05.015.14 | 

| 6 | 330 | 1382368935 | name.rar | 127.06.015.14 | 

所以如果表是这样的,所以查询应显示的行1-6(通过ID)。

+0

如果您共享您尝试到现在为止我们的(SQL你写的,即使错了),你会得到更多的答案 – mucio

+0

的问题是,我甚至无法想象的SQL应该怎么看起来像 –

+0

更多样数据会很好。 – Tony

回答

0

因此,您不能使用DISTINCT,因为这是一个后过滤器。您将不得不使用GROUP BY,这可以使您在一列(或一组列)上具有唯一性。将其与DATE_SUB(限制基于日期)和LIMIT(限制为6个条目)相结合,你应该很好!

SELECT * 
FROM download_records 
WHERE 
    time >= DATE_SUB(time,INTERVAL 2 DAY) 
GROUP BY modification_id 
ORDER BY time DESC 
LIMIT 0, 6 
+0

,返回错误 –

+0

'错误号:1064 您的SQL语法错误;检查与您的MySQL服务器版本相对应的手册,以便在第1行'GROUP BY'修改ID'LIMIT 0,6'处使用正确语法的手册 SELECT * FROM'mods_downloads' WHERE'time'> = DATE_SUB(time,INTERVAL 2 DAY)ORDER BY time DESC GROUP BY'modification_id' LIMIT 0,6' –

+0

我的错误,'GROUP BY'需要在'ORDER BY'之前。您可能需要调整WHERE子句的时间;我在DATETIME字段而不是Unix时间戳测试了它。 –