2013-04-15 269 views
2

你好我有两个表这样的 -Mysql的复杂查询

Event 
id title 
1 'Test 1' 
2 'Test 2' 
3 'Test 3' 

and Schedule 
id event_id price event_date 
1  1   100 2013-04-15 
2  1   150 2013-04-20 
3  2   80  2013-04-18 
4  3   120 2013-04-26 
5  3   140 2013-04-22 
6  2   100 2013-04-22 

我想事件如下 -

- 由EVENT_DATE ASC

e.id e.title s.price s.event_date 
1  Test 1 100  2013-04-15 
2  Test 2 80  2013-04-18 
3  Test 3 140  2013-04-22 

我试着查询这样有序的独特事件

SELECT e.id, 
     e.title, 
     s.price, 
     Min(s.event_date) AS min_start 
FROM events AS e 
     JOIN schedules AS s 
     ON (e.id = s.event_id) 
GROUP BY s.event_id; 

然后通过迭代先前查询的结果集再次查询事件。但这是太多的查询。我也没有得到正确的价格。达到以上结果的最佳方式是什么?谢谢

回答

2

可以有许多可能的解决方案来解决您的问题。其中之一,我曾经这样做是通过使用一个单独的子查询,每event_ID获得第一个event_date。然后将结果连接到另一个表以获取其他列。

SELECT a.ID, a.Title, 
     b.Price, b.Event_date 
FROM `Event` a 
     INNER JOIN `Schedule` b 
      ON a.ID = b.event_ID 
     INNER JOIN 
     (
      SELECT event_ID, MIN(event_date) min_date 
      FROM `Schedule` 
      GROUP BY event_ID 
     ) c ON b.event_ID = c.event_ID AND 
       b.event_date = c.min_date 

输出

╔════╦════════╦═══════╦══════════════════════════════╗ 
║ ID ║ TITLE ║ PRICE ║   EVENT_DATE   ║ 
╠════╬════════╬═══════╬══════════════════════════════╣ 
║ 1 ║ Test 1 ║ 100 ║ April, 15 2013 00:00:00+0000 ║ 
║ 2 ║ Test 2 ║ 80 ║ April, 18 2013 00:00:00+0000 ║ 
║ 3 ║ Test 3 ║ 140 ║ April, 22 2013 00:00:00+0000 ║ 
╚════╩════════╩═══════╩══════════════════════════════╝ 

的simpliest方式,如果你只在两列感兴趣的是

+0

谢谢,这是我一直在寻找,但有没有subquerying方式? – Shwetanka

+0

使用相关的子查询,但仍然是子查询。 ':D'我宁愿这样做,因为mysql不支持窗口函数。 –

0
SELECT s.title, a.event_id, a.price, a.event_date 
    FROM schedule a JOIN event s ON a.event_id = s.ID 
WHERE a.event_date = (SELECT MIN (b.event_date) 
         FROM schedule as b 
         WHERE b.event_id = a.event_id) 
ORDER BY a.event_id ASC 
0

,你可以创建一个视图并从中选择:

CREATE VIEW scheduleview AS select * from schedule group by event_date,event_id; 
select * from scheduleview group by event_id; 
0

它看起来复杂,但它的简单要么

select * from 

    (select 
      event.id, 
      event.title, 
      schedule.event_date, 
      schedule.price, 
      event_id 
    from schedule 
    left join event on event.id=schedule.event_id 
    group by event_date,event_id 
    )s 

group by s.event_id; 
0

选择a.id,a.title, b.price,从event b.event_date 一个 内连接schedule b ON a.id = b.event_id order by b.event_id desc;