获取不同的行

时间:2018-03-10 11:44:29

标签: php mysql

我有一张表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

2 个答案:

答案 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小提琴。