2012-02-24 112 views
3

我有一个将存储事件的数据库。每个事件都有不同的活动。该数据库作出这样(我知道这是不是最好的数据库设计,但我什么是给我的工作):选择列出了所有活动的最近事件SQL

eventID | date  | eventname | activity 
___________________________________________ 
0001 | 01/01/2012 | name1  | activty1 
0002 | 01/01/2012 | name1  | activty2 
0003 | 01/05/2012 | event2 | activty1 
0004 | 01/05/2012 | event2 | activty2 
0005 | 01/07/2012 | name1  | activty1 

同一个事件可以有多个活动。我可以从事件(活动)获取所有记录的唯一方法是通过eventname列。

我想要做的是获得最后20个事件与它的所有活动。因此,我不能简单地选择20行(使用LIMIT,因为这不会每次得到20个事件,因为有些事件有2个活动,其他10个)。

我不能使用SELECT DISTINCT eventname,因为某些事件在不同的日期有相同的名称。我需要的是只有在日期不同的情况下才有独特的事件名称。

我迷失了方向。

谢谢。

+0

您是否想要最近的20个事件,但每个事件名只能表示一次? – 2012-02-24 16:18:35

+0

@ConradFrix我正在寻找20个活动,以及他们的所有活动。我期望获得代表20个事件的基本记录数x。 - 希望这是有道理的。 – blo0p3r 2012-02-24 17:01:31

+0

你可以查询最近20个事件,然后在游标中循环它们,查找每个事件的所有活动,然后将这些事件插入到一个表对象中,然后返回这些行?可能不是最快的方法,但它会非常简单。 – Ted 2012-02-24 17:17:26

回答

2
SELECT 
    * 
FROM 
    event 
INNER JOIN 
(
    SELECT eventName, Date 
    FROM  events 
    GROUP BY eventName, Date 
    ORDER BY Date DESC 
    LIMIT 20 
) 
    AS last_20_events 
    ON last_20_events.eventName = events.eventName 
    AND last_20_events.Date  = events.Date 
+0

关闭,这是有道理的,但我的eventIDs是不同的。数据库中的每个条目的eventID都不相同。我已经编辑了一些问题来显示这个。 – blo0p3r 2012-02-24 16:56:14

+0

这里给了我最后20条记录,但它会超过20条记录,因为我想要20个事件,而不是20个活动。 – blo0p3r 2012-02-24 17:00:11

+0

只需将eventID的引用更改为eventName即可。 – 2012-02-24 17:11:11

0
SELECT eventName, date, 
GROUP_CONCAT(activity ORDER BY activity SEPARATOR ', ') 
FROM events 
GROUP BY eventName, date 
ORDER BY date desc 
LIMIT 20 

我没有在时刻访问MySQL数据库,所以我一直没能对此进行测试。此答案基于SO上的其他已接受答案(搜索group_concat)