2013-02-22 85 views
0

对不起,转发,但这是一个问题,我在一个月前得到了大部分答案。但仍然没有完全按照我想要的方式工作。MYSQL日期格式化使用组concat

有一个日期字段,我正在脱离我的数据库以下;

SELECT event,event_name, 
GROUP_CONCAT(DATE_FORMAT(ed.date,'%b %e') ORDER BY ed.date SEPARATOR ',') as date2 
FROM events ev 
LEFT JOIN event_dates ed ON ev.eid=ed.eid 
WHERE ev.yr='2013' 
GROUP BY ev.eid 

这产生的这个日期列表占用了很多空间。

5月16日,5月23日,5月30日,6月6日,6月20日

我希望它看起来像

月16,23,30,君6,20

这里是我根据上次的输入尝试了查询。但它不起作用,因为子查询似乎不知道事件ID。猜测我可能需要将其转换为连接?

SELECT DISTINCT ev.event_id, 
    GROUP_CONCAT(DISTINCT DATE_FORMAT(race_date,'%a') ORDER BY race_date 
    SEPARATOR ', ') as date1, 

    (SELECT GROUP_CONCAT(dm) FROM 
    (SELECT CONCAT(
    MONTHNAME(race_date), 
    ' ', 
    GROUP_CONCAT(DAY(race_date) ORDER BY race_date) 
    ) as dm 
FROM event_dates ed1 WHERE ed1.event_id=ev.event_id 
GROUP BY MONTH(race_date))as t) as date2 

FROM events ev 
JOIN event_dates ed ON ev.event_id = ed.event_id AND ev.race_year = ed.race_year 
GROUP BY event_id 

回答

0

这应该让你很接近你正在寻找:

SELECT event_name, date2 
FROM (
    SELECT 
    @showMonth:=IF(CONCAT(MONTHNAME(ed.date),ev.eid)[email protected],'',CONCAT(MONTHNAME(ed.date), ' ')), 
    event_name, 
    MONTHNAME(ed.date), 
    GROUP_CONCAT(CONCAT(@showMonth, DATE_FORMAT(ed.date,'%e')) ORDER BY ed.date SEPARATOR ',') as date2, 
    @prevMonth:=CONCAT(MONTHNAME(ed.date),ev.eid) 
    FROM events ev 
    LEFT JOIN event_dates ed ON ev.eid=ed.eid 
    JOIN (SELECT @showMonth:='', @prevMonth:='') r 
    WHERE ev.yr=2013 
    GROUP BY ev.eid 
) t 

Sample Fiddle Demo

+0

这并没有工作,它抑制一个月有相同月份的下列事件。 – davewhirlwind 2013-02-22 18:44:46

+0

@davewhirlwind - 只需将事件添加到prevMonth就像这样:http://sqlfiddle.com/#!2/9a4b4/3 – sgeddes 2013-02-22 18:53:17

+0

@davewhirlwind - 我已经更新了实际使用ev.eid而不是event_name的答案 - - 祝你好运! – sgeddes 2013-02-22 18:54:41