2013-04-01 61 views
0

表结构:从表MySQL的选择最后20个最新的唯一URL

CREATE TABLE Test(
    ID PRIMARY KEY AUTO_INCREMENT, 
    UserID INT, 
    URL VARCHAR(255), 
    MyTime DATETIME 
)engine=myisam; 

样本数据:

ID  UserID  URL    MyTime 
1  555  /index   2013-04-01 16:43:21 
2  777  /user   2013-03-01 16:43:21 
3  555  /user   2013-03-01 13:00:00 
4  555  /panel   2013-03-01 16:00:00 
5  555  /panel   2013-03-03 15:00:00 

现在查询假设选择的所有数据,其中URL/指数因为/索引是主页,所以我希望它被忽略。此外,它选择的数据必须是最新的记录,忽略/索引数据。它也必须忽略相同的URL,如果它落在最后10条记录中,这意味着如果同一用户多次访问同一页面,我只需要选择其中的一个来包含在的限制10中。这将忽略/面板页有ID 4

用户需要的输出将是:

ID  UserID  URL    MyTime 
3  555  /user   2013-03-01 13:00:00 
5  555  /panel   2013-03-03 15:00:00 

我尝试:

SELECT * 
From Test 
WHERE URL NOT LIKE '%/index%' AND UserID = '555' 
ORDER BY MyTime DESC 
LIMIT 10 

此查询选择过去数据,但它包含重复的URL,我如何摆脱重复的网址,只有最新的记录与唯一的网址?

感谢您的帮助。

回答

2

您希望对子查询使用GROUP BY函数。如果您只想查看网址,则可以使用子查询。

SELECT * 
FROM Test INNER JOIN 
    (SELECT url, max(mytime) maxtime 
    FROM Test 
    WHERE URL NOT LIKE '%/index%' 
    AND UserID = '555' 
    GROUP BY url) n on test.url = n.url AND n.maxtime = Test.mytime 
ORDER BY maxtime DESC 
LIMIT 20 
+0

不知道我是如何忘记GROUP BY的。我很尴尬。非常感谢 – GGio

+0

@MattBusche如何显示其他列。你需要包括这些。 – DevelopmentIsMyPassion

+0

@AshReva我更新了,以允许用户拉所有列,但不知道这是他需要什么(虽然问题确实表明) –