【问题标题】:Joining two tables with a Sum condition使用 Sum 条件连接两个表
【发布时间】:2016-04-09 14:15:13
【问题描述】:

我有一个查询,我根据从该表中选择的 ID 生成一个值字段的总和:

SELECT Z,Sum(Z_N) FROM `TableA` 
WHERE `N_ID` in ('7703','7674','7689','7690','7691','7700','7719') 
group by Z 
having Sum(Z_N) > 65

但是,我需要从我自己管理的第二个表中动态获取 ID 列表:

Select group_concat(N_ID) from Table2 where N2_ID ='7703'

N2_ID='7703' 实际上是我通过代码推送的变量。然而我试图让第二个查询“内部”第一个替换手册('7703','7674','7689','7690','7691','7700','7719')

显然(我认为)这是某种形式的加入,但它在这个星期六早上让我忘记了。

【问题讨论】:

  • 您想要 N_ID 列出 Table2 中的 N2_ID = 7703 还是其他什么? (谈论第二个查询)

标签: mysql join group-by


【解决方案1】:

INNER JOIN 可以过滤您的结果。

SELECT TableA.Z,Sum(TableA.Z_N) 
FROM `TableA`
INNER JOIN Table2 ON Table2.N_ID = TableA.N_ID
where Table2.N2_ID ='7703'
group by TableA.Z 
having Sum(TableA.Z_N) > 65

为了提高性能,您应该(至少)在Table2(N2_ID)TableA(N_ID, Z) 上有索引。索引Table2(N2_ID, N_ID)TableA(N_ID, Z, Z_N) 可能会更好,因为完整的查询只会对索引进行操作。

注意:如果Table2.N_ID 是唯一的(或主键),则此方法有效。否则,您可能会得到意想不到的结果。

【讨论】:

  • 哪个更快(SubQuery 或 INNER-JOIN,在这个特定场景中)
  • @MalikAsif,我不希望性能有所不同。但是在 MySQL-Version >= 5 上 JOIN 不应该变慢
  • @MalikAsif,这个Question 刚刚进入我的脑海。所以我对性能不再那么肯定了。您应该在大测试数据上测试这两种解决方案。
  • @Malik Asif 我将测试并报告回来,现在子选择(对我来说)很慢,在 0.2 秒子查询上增加了大约 2 秒。我将检查索引,然后运行/测试两者并更新问题或评论
  • @PaulSpiegel 我无法完成这项工作,我只是阅读了警告; N_ID 在任一表中都不是唯一的。每个表都将该 NID 用于多个关系。
【解决方案2】:

您可以使用子选择

SELECT Z,Sum(Z_N) FROM `TableA` 
WHERE `N_ID` in (Select N_ID from Table2 where N2_ID ='7703') 
group by Z 
having Sum(Z_N) > 65

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    • 2016-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多