我有一张表properties
:
propertyID userID defaultStateID defaultStateYear
1 1 1 2017
2 1 2 2017
3 2 1 2018
4 3 3 2018
每个属性属于某个用户(用户1具有属性1,2;用户2具有属性3,用户3具有属性4)。每个属性都有一个默认状态,由defaultStateID和defaultStateYear标识(参见下面的表states
)。
然后我有一张表states
显示有关某些时间点属性的数据(有关它们的数据 - 所有者和区域 - 不时更改):
stateID propertyID owner area timestamp stateYear
1 1 David Smith 15 123456789 2017
2 2 Amanda Green 74 123456799 2017
3 1 David Smith 15 123456999 2017
1 3 Amanda Green 12 123459999 2018
2 1 Peter Black 11 123499999 2018
3 4 Jack Stone 62 123999999 2018
4 2 Amanda Green 70 129999999 2018
stateID和stateYear的组合在此表中是唯一的。
在上面的示例中,与最近的状态(2018年的stateID 2)相比,propertyID 1的状态从其默认状态(2017年的stateID 1)更改。同样,propertyID 2的状态也发生了变化。
如何在其属性中显示某些用户的更改(使用MySQL)?
所需的输出(对于userID 1):
propertyID owner area timestamp
1 David Smith 15 123456789
1 Peter Black 11 123499999
2 Amanda Green 74 123456799
2 Amanda Green 70 129999999
我尝试了以下代码,但代码只是加载无限时间(在phpMyAdmin中),没有输出/错误:
SELECT p.propertyID, -- getting default state of property
p.defaultStateID,
p.defaultStateYear,
s.owner AS owner,
s.area AS area,
s.timestamp AS timestamp
FROM properties AS p
LEFT JOIN states AS s
ON p.propertyID = s.propertyID
AND p.defaultStateID =
(SELECT si.stateID
FROM states AS si
WHERE si.stateID = p.defaultStateID AND si.stateYear = p.defaultStateYear AND p.userID=1)
UNION ALL
SELECT p.propertyID, -- getting the most recent state of property
p.defaultStateID,
p.defaultStateYear,
s.owner AS owner,
s.area AS area,
s.timestamp AS timestamp
FROM properties AS p
LEFT JOIN states_full AS s
ON p.property_id = s.property_id
AND s.timestamp =
(SELECT MAX(timestamp)
FROM states
WHERE s.propertyID = p.propertyID)
WHERE p.userID=1
答案 0 :(得分:0)
所以,如果我理解正确,这里的查询应该为你解决问题:
SELECT s.propertyID, s.owner, s.area, s.timestamp
FROM states s
INNER JOIN properties p ON p.propertyID = s.propertyID
WHERE p.defaultStateID = s.stateID
AND p.userID = 1
之后我们将默认状态过滤为等于 stateID,因为您为用户1指定了所需的输出,I 为与第一个用户匹配的userID添加了一个过滤器。
希望这对你有所帮助。
答案 1 :(得分:0)
您似乎想要给定用户属性的初始状态和最后状态。
但是,您的数据模型非常令人困惑。为什么在名为stateid
的表中会复制名为states
的内容?为什么表之间的连接是属性和年份?这些真的没有意义。数据库没有正确使用表上的键。
但是,根据您的描述,这似乎可以满足您的需求:
select s.*
from properties p join
(select s2.propertyid, max(s2.year) as maxyear
from states s2
group by s2.propertyid
) sp
on sp.propertyid = p.propertyid join
states s
on s.propertyid = p.propertyid and
s.year in (p.year, sp.maxyear)
order by sp.propertyid, sp.year;
编辑:
这似乎可以满足您的需求:
select s.*
from properties p join
(select s2.propertyID, max(s2.timestamp) as maxtimestamp
from states s2
group by s2.propertyID
) sp
on sp.propertyID = p.propertyID join
states s
on s.propertyID = p.propertyID and
(s.timestamp = sp.maxtimestamp or
s.stateId = p.defaultStateID
)
where p.userID = 1
order by sp.propertyID;
Here是SQL小提琴。