2013-02-01 49 views
2

我有2个不同的表:
档案(ID,姓名,DISP)
dossiers_etat(ID,id_dossier,开放,incharge,日期)如何从哪里选择最后一条记录= x?

档案很简单,就是用自己的ID名称的列表

dossiers_etat被链接到在卷宗的关系1-N:1个档案可以连接到N卷宗-政变,得益于加入:dossiers.id = dossiers_etat.id_dossier

我使用dossiers_etat作为时间轴记录我档案的每个状态变化:1档案今天可以打开=“Y”,但是打开=“N”唉
我能找到的关于一个档案感谢dossiers_etat.date或dossiers_etat.id(最后日期和最后一个ID显示最近的记录)

我怎样才能完成这个查询的最后一条记录有档案的列表在他们的最后记录中是否打开=“Y”并且incharge =“ - ”?

SELECT * 
FROM dossiers 
JOIN dossiers_etat 
ON dossiers.id = dossiers_etat.id_dossier 
WHERE dossiers.disp = "Y" AND dossiers_etat.open = "Y" AND dossiers_etat.incharge = "-" 
ORDER BY dossiers.id DESC 

非常感谢您的帮助!

+0

你可以在sqlfiddle.com上提供一些你的数据的例子吗? – mvp

回答

1

试试这个:

SELECT * 
FROM dossiers B 
JOIN dossiers_etat as C 
ON B.id = C.id_dossier 
WHERE B.disp = "Y" AND C.open = "Y" AND C.incharge = "-" 
AND C.date = (SELECT max(date) from dossiers_etat WHERE id_dossier = C.id_dossier) 
ORDER BY B.id DESC 
+0

似乎工作!感谢Orangecrush! – jrm

+0

不客气! :) – Orangecrush

1

试试这个

SELECT * 
FROM dossiers 
JOIN dossiers_etat 
ON dossiers.id = dossiers_etat.id_dossier 
WHERE dossiers.disp = "Y" AND dossiers_etat.open = "Y" AND dossiers_etat.incharge = "-" 
ORDER BY dossiers.id DESC 
limit 1 
+0

这将无法正常工作,因为您只会获取满足where约束的最后一个条目。即使它不是现在正在使用的那个。 – Shimu

1

试试这个:

SELECT 
    * 
FROM 
    dossiers 
     JOIN 
    dossiers_etat ON dossiers.id = dossiers_etat.id_dossier 
WHERE 
    dossiers.disp = 'Y' 
     AND dossiers_etat.open = 'Y' 
     AND dossiers_etat.incharge = '-' 
     AND dossiers_etat.id = (SELECT 
      * 
     FROM 
      dossiers_etat 
     GROUP BY id_dossiers 
     ORDER BY date DESC) 
ORDER BY dossiers.id DESC; 

随着子选择,你会得到的ID从档案表中的最后一个条目。并且在外部SELECT中,您将获得所有打开正确条目并且也在最后记录内的行。

+0

子查询应该包含'select id_dossiers from ...'而不是'select * from ...'。 – Orangecrush

+0

您认为这是比您的解决方案更好的解决方案吗? – jrm

相关问题