![]() |
1
2
我最近遇到了一个类似的 problem . 我不是一个SQL专家,所以我不能给出很多关于什么是最好的设计的建议。但在专业人士介入之前,这可能有助于:
注意,我在您的订阅表中添加了一个ID列(稍后我将解释原因)。 现在,让我们来分析一下这是如何工作的(或者我认为它是如何工作的,不管怎样,如果我错了,我很乐意被纠正)。 首先,检索给定人员/新闻稿的所有记录。这就是子查询所做的(是的,我知道你说过你不希望有子查询,但我不确定没有子查询你能做到)。我按个人ID和新闻稿ID分组。这可以返回多行。注意,我选择的是max(id)。如果使用自动增量ID,并且假设ID列中数字最大的行是组中最新的行(即,如果不手动插入ID),则此子查询将为每个人/新闻稿获取最后一行的ID。 因此,可以将其与订阅表联接:联接条件是订阅行的ID必须与从子查询中检索到的最大ID匹配。这里,您只考虑每个新闻稿/个人的最新记录。然后,使用where条件来计算非活动订阅。 如果要将结果限制在给定的新闻稿(或给定的人)中,请将该条件添加到WHERE子句中。 索引应该有助于使这个查询运行得更快。 希望这有帮助。 补充 如果出于某种原因,您不能保证max(subscriptions.id)将对应于最后插入的行,那么您可以这样做(我认为,这遵循相同的逻辑,但有点冗长,而且可能效率较低):
新编辑
在第二个想法上,我添加了一个备选方案
|
![]() |
2
2
分开你
|
![]() |
3
1
有序分析函数”是解决这类问题的标准方法。一百万张唱片,没问题…当然,这取决于你的机器的力量。
|
![]() |
4
0
我觉得你的设计不错。子查询没有固有的缓慢性-如果是表达查询的最佳方式,请使用它们。 以下是获取所有最新(即未重写)指令的查询:
然后,可以将此查询用作另一个查询的子查询,以获取所需的内容。对于您的查询1:
查询2:
你肯定想要一个索引
编辑: 哎呀,子查询中的订阅列可以来自任意行,而不是生成max(更新)的行。您必须重新加入原始表:
|
![]() |
hello_programmers · Mysql从其他表输出一列 1 年前 |
![]() |
Community wiki · 这个MySQL语句出了什么问题? 1 年前 |
![]() |
Community wiki · 优化从同一表中提取的多列的查询 2 年前 |
![]() |
Popo · Sql查询:返回数据库中不可用的where条件 2 年前 |
|
Hamdan Nuramdani · 对账单中一周内不同表中的数据求和 2 年前 |
|
Kugelfisch · 用php为数据库加密数据 2 年前 |