sql-如何选择/删除最大值的行取决于其他两个行

k2arahey  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(322)

我在一家房地产租赁公司实习。我负责开发symfony下的客户关系管理。
因此,我的一个实体是财产(房屋)及其可用性。见下表结构。

我现在面临的问题是,可用性是为每天(例如28/01、29/01、30/01)定义的,而不是为一段时间(例如28/01->30/01)定义的。所以,这张table真的很重(约71万行)。此外,在我们更改编辑可用性的方式之前,它为同一日期创建了一个新行,而不是编辑它。所以,这张表有很多重复。
我想要的是,通过只保留其中具有最大值的行来减轻db date_modif_availabilities 同样的道理 date_availabilities 以及 id_properties .
例如,如果我有这些行(可用性\重复项):

我只想保留最新修改的行,如下所示(可用性\u保留\u最大值):

问题是,我对sql语言了解不够。我能写一些基本的脚本,但不能写复杂的子查询。即使是我找到的代码样本。
事先谢谢你的帮助。

jhiyze9q

jhiyze9q1#

您可以选择不存在修改日期更大的元素的元素。
像这样:

SELECT avl1.*
FROM   availabilities avl1
WHERE  NOT EXISTS (SELECT *
                   FROM   availabilities avl2
                   WHERE  avl1.date_availabilities = avl2.date_availabilities
                     AND  avl1.id_properties = avl2.id_properties
                     AND  avl2.date_modif_availabilities > avl1.date_modif_availabilities);

这当然有一个前提条件,那就是三列的组合 date_availabilities , id_properties 以及 date_modif_availabilities 是独一无二的。
此外,似乎所有列(pk除外)都可能是 NULL . 我觉得有点奇怪。

hujrc8aj

hujrc8aj2#

你可以用 subquery :

select t.*
from table t
where id_availabilities = (select t1.id_availabilities
                           from table t1 
                           where t1.id_properties = t.id_properties and
                                 t1.date_availabilities = t.date_availabilities
                           order by t1.date_modif_availabilities desc
                           limit 1
                          );

但是,如果您担心性能问题,那么您需要索引 (id_properties, date_availabilities and id_availabilities) .

相关问题