2012-05-20 119 views
1

我似乎正在努力与这一个,我希望有人能为我散光。MySQL多个连接和最大日期

petevents将有多个重复事件,除了日期会有所不同。我只想要每个petevent中最新的一个。从@aleroot

SELECT name, pets.id petid, petroutineschedules.id prsid, petroutineschedules.eventid, timeunit, dateunit, petevents.startdate, petevents.id peid 
FROM 
pets 

LEFT OUTER JOIN 
    petroutineschedules ON pets.id = petroutineschedules.petid 

LEFT OUTER JOIN 
(
    SELECT * 
    FROM petevents p1 
    WHERE p1.startdate = 
     (
      SELECT MAX(startdate) FROM petevents p2 
      WHERE p1.petid = p2.petid 
     ) 
) AS petevents 
    ON pets.id = petevents.petid 
     AND petevents.eventid = petroutineschedules.eventid  

WHERE (pets.id = 1025) AND (pets.deletedat IS NULL) 
GROUP BY petevents.startdate , name , pets.id , petroutineschedules.id ,petroutineschedules.eventid , timeunit , dateunit 
ORDER BY eventid 

回答

1

创建一个视图和

SELECT name, 
     pets.id petid, 
     petroutineschedules.id, 
     petroutineschedules.eventid, 
     timeunit, 
     dateunit, 
     petevents.startdate 
FROM pets 
     LEFT OUTER JOIN petroutineschedules 
     ON pets.id = petroutineschedules.petid 
     LEFT OUTER JOIN petevents 
     ON pets.id = petevents.petid 
      AND petevents.eventid = petroutineschedules.eventid 
WHERE (pets.id = 1025) 
     AND (pets.deletedat IS NULL) 
GROUP BY petevents.startdate, 
      name, 
      pets.id, 
      petroutineschedules.id, 
      petroutineschedules.eventid, 
      timeunit, 
      dateunit 

更新的查询左连接其他表吧。

CREATE VIEW PETEVNT_VW AS SELECT PETID,EVENTID, MAX(STARTDATE) AS MAXSTARTDATE GROUP BY PETID,EVENTID 
+0

这工作很好。你忘了FROM,但没什么大不了的。谢谢! – dbinott

2

如果你可以有你有重复的事件,以获得最大的新的,尝试了这种方式:

SELECT 
name, 
pets.id petid, 
petroutineschedules.id, 
petroutineschedules.eventid, 
timeunit, 
dateunit, 
petevents.startdate 
FROM 
pets 
    LEFT OUTER JOIN 
petroutineschedules ON pets.id = petroutineschedules.petid 
    LEFT OUTER JOIN 
(SELECT * FROM petevents p1 WHERE p1.startdate = 
(SELECT MAX(startdate) FROM petevents p2 WHERE p1.petid = p2.petid)) ON pets.id = petevents.petid and petevents.eventid = petroutineschedules.eventid 
WHERE 
(pets.id = 1025) AND (pets.deletedat IS NULL) 
GROUP BY petevents.startdate , name , pets.id , petroutineschedules.id , petroutineschedules.eventid , timeunit , dateunit 

基本上修改的部分是这个:

LEFT OUTER JOIN 
    (SELECT * FROM petevents p1 WHERE p1.startdate = 
    (SELECT MAX(startdate) FROM petevents p2 WHERE p1..petid = p2.petid)) ON pets.id = petevents.petid and petevents.eventid = petroutineschedules.eventid 

我加入了获取最新活动的子查询...

+0

我用你的查询,但我从petevent.startdate和petevent.id返回NULL,但该行确实存在。 已更新后的查询 – dbinott

0
Select 
name, 
pets.id petid, 
petroutineschedules.id, 
petroutineschedules.eventid, 
timeunit, 
dateunit, 
petevents.startdate 
from (
SELECT 
name, 
pets.id petid, 
petroutineschedules.id, 
petroutineschedules.eventid, 
timeunit, 
dateunit, 
petevents.startdate, 
Rank() over (Partition BY petevents.startdate order by petevents.startdate DESC) as Rank 
FROM 
pets 
    LEFT OUTER JOIN 
petroutineschedules ON pets.id = petroutineschedules.petid 
    LEFT OUTER JOIN 
petevents ON pets.id = petevents.petid and petevents.eventid = petroutineschedules.eventid 
WHERE 
(pets.id = 1025) AND (pets.deletedat IS NULL) 
GROUP BY petevents.startdate , name , pets.id , petroutineschedules.id , petroutineschedules.eventid , timeunit , dateunit 
) 
where rank = 1 
+0

我没有使用MS SQL。 AFAIK没有Rank()和以上。 – dbinott