1

我的表结构看起来像这样

客户端

clientid
clientname

tbl设施

facilityid
facilityname

tblclient设施

clientid
facilityid
moveindate

我允许我的用户输入未来日期作为搬入日期,我想做的是选择我的客户居住的当前设施。我试过了

SELECT 
 clientid,
 facilityid,
 moveindate

FROM 
 tblclientfacilities
WHERE 
 MAX(tblclientfacilities.moveindate) <= now()
GROUP BY
  tblclientfacilities.clientid

显然这是行不通的。有人可以让我在这里走上正轨吗?谢谢!

4

5 回答 5

1
SELECT  clientId,
        (
        SELECT  facilityId
        FROM    tblclientfacilities cf
        WHERE   cf.clientId = c.clientId
                AND cf.moveDate <= NOW()
        ORDER BY
                cf.clientId DESC, moveDate DESC
        LIMIT 1
        ) AS currentFacility
FROM    tblclients c

为此创建一个唯一索引以tblclientfacilities (clientId, moveDate, facilityId)使其快速工作。

于 2013-04-03T17:35:33.477 回答
0

尝试使用HAVING聚合函数。

HAVING MAX(tblclientfacilities.moveindate) <= now()
于 2013-04-03T17:28:44.713 回答
0

如果您使用该子句,如果要过滤聚合结果,请group by考虑使用该子句having

SELECT 
 clientid,
 moveindate,
 facilityid
FROM 
 tblclientfacilities
GROUP BY
  tblclientfacilities.clientid
HAVING MAX(tblclientfacilities.moveindate) <= now()

文档:http ://www.w3schools.com/sql/sql_have.asp

于 2013-04-03T17:30:47.463 回答
0

您将 ofwhere的用法与 . 的用法混淆了having

快速参考:

SELECT # Desired columns and expressions
FROM # Source tables, and possible joins
WHERE # Filter conditions on the raw data
GROUP BY # Fields you want your data to be grouped-by
HAVING # Filter conditions on the grouped data
于 2013-04-03T17:32:14.500 回答
0

将您的客户/设施/日期记录与每个客户最近入住的记录相结合:

    SELECT tcf.*
      FROM tblclientfacilities tcf
INNER JOIN (  SELECT clientid, MAX(moveindate) AS moveindate
                FROM tblclientfacilities
               WHERE moveindate < CURRENT_DATE
            GROUP BY 1, 2) most_recent_moveins
        ON tcf.clientid = most_recent_moveins.clientid
           AND
           tcf.moveindate = most_recent_moveins.moveindate)
于 2013-04-03T17:37:07.207 回答