【问题标题】:Using a self-join for a min value based off of an existing SQL query根据现有 SQL 查询使用自联接获取最小值
【发布时间】:2013-05-17 03:46:39
【问题描述】:

我的问题与this StackOverflow question 非常相似,显然是common issue 学习SQL。从本质上讲,我正在尝试使用现有的表字段来查找 min() 值。典型的解决方案是创建一个有点自引用的子查询。我从上面的示例中复制了这段代码:

select *
from yourtable t1
inner join
(
  select min(A) A, id
  from yourtable
  group by id
) t2
  on t1.id = t2.id
  and t1.A = t2.A

然而,在我的示例中,我的 SQL 查询中有许多其他条件,因此,使用示例中列出的子查询将不起作用。换句话说,我有一个现有的查询,它有很多不同的参数,我需要保留和使用这些参数来获得适当的查询结果。我需要附加一些可以有效执行此操作的新代码:

select *
from yourtable t1
inner join
(
  select min(A) A, id
  from *my existing query results*
  group by id
) t2
  on t1.id = t2.id
  and t1.A = t2.A

如果我要执行第一个示例中列出的操作,我将根据查询中已存在的其他条件选择结果中不存在的最小值。

如果您对这里感兴趣,现有的查询链接如下。它是 Drupal 7 中的 Views 模块使用 uc_catalog 视图生成的查询。然后我使用hook_views_query_alter() 进行更改。我正在使用 MYSQL 数据库。


编辑:也许对我正在尝试做的更好的描述是将 Groupwise Min 任务附加到现有查询并复制它的 WHERE 条件以在 Groupwise 任务中使用。你能告诉我怎么做this in this query吗?

【问题讨论】:

  • 让我指出,select min(A) A, id FROM ... GROUP BY id 在大多数 SQL 实现中是非法的,因为 A 既没有聚合也没有列在 GROUP-BY 列表中。虽然 MySql 表扩展允许这样的语法,但结果将是不可预测的。
  • @PM A 是聚合结果的别名。这很好,花花公子。
  • @Strawberry - 对。应该注意到了。

标签: mysql sql


【解决方案1】:
select *
from (my existing query) t1
inner join
(
  select min(A) A, id
  from (my existing query)x
  group by id
) t2
  on t1.id = t2.id
  and t1.A = t2.A

【讨论】:

  • 我想我问错了问题。该代码 sn-p 是我要完成的工作的抽象。我个人觉得解决方案会来自某种WHERE existing_query.id = (SELECT id FROM table HAVING A = min(A)
  • 嗯,我总是渴望学习新技术……但如果没有成功,请考虑描述一个不那么抽象的问题。
  • 当我的词汇量赶上我的工作时,我的问题将不那么抽象——我向你保证!我已将具体示例和我尝试过的两件事复制到我的 Pastebin pastebin.com/G6DM1r8Q
  • 虽然您的第二次尝试比第一次要好得多,但距离轻松成型还差得远。我认为您应该重新开始,逐渐增加复杂性,并非常明确地说明您实际需要返回哪些列,并且绝对避免 IN(SELECT...)!
  • 我明白你的意思。问题是我不能重写查询只能修改它,因为它是一个更大的框架(特别是 Drupal 7 视图)的一部分
猜你喜欢
  • 1970-01-01
  • 2016-07-09
  • 1970-01-01
  • 2023-03-08
  • 2020-03-07
  • 2019-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多