【问题标题】:Left joining a nested select statement utilizing 3 tables左加入使用 3 个表的嵌套选择语句
【发布时间】:2016-12-21 00:44:43
【问题描述】:

我不确定用三个表解决此问题的更好方法。也许有一个我可以使用的功能?
CustID 是主要的主键,我需要加入 Table3 中的销售数据。销售数据应根据 CustID 附加到表中。问题是table3中的销售数据没有CustID信息,只有序列号和销售信息。

如何使用左连接并正确附加我需要的内容?

附加问题:

我不知道何时可以调用数据进行交叉引用。

1.) 我可以在查询的后面引用嵌套 select 语句之外的 numid,即使它是在嵌套 select 语句中编码的?

2.) 即使我没有在 select 语句中提取一列数据,我是否可以在 where 语句中创建 mysql 引用数据? (虽然我在 from 语句中引用了该表)。

3.) 如果我在 from 语句中将 table2 重命名为“tb2”。将来在嵌套的 select 语句中,我还会将 table2 称为“tb2”吗?

感谢您的帮助。

 Table1
 CustID    serialnumber
   1           1261
   2           6337
   3           1412
   4           6128
   5           1231
 Table2
 CustID    Address   Name    Joindate
   1        xxxx     xxx     xx/xx/xxx
   2        xxxx     xxx     xx/xx/xxx
   3        xxxx     xxx     xx/xx/xxx
 Table3    
 SerialNumber  Purchasedate     email      Sale
      1261      xx/xx/xxxx     xx@xx.com   $20
      1261      xx/xx/xxxx     xx@xx.com   $30
      1261      xx/xx/xxxx     xx@xx.com   $5.99
      1261      xx/xx/xxxx     xx@xx.com   $5.00
      6337      xx/xx/xxxx     xx@xx.com   $72
      1412      xx/xx/xxxx     xx@xx.com   $5.00 
      1412      xx/xx/xxxx     xx@xx.com   $5.00
      1412      xx/xx/xxxx     xx@xx.com   $5.00
      6128      xx/xx/xxxx     xx@xx.com   $5.00
      1231      xx/xx/xxxx     xx@xx.com   $5.00
      1261      xx/xx/xxxx     xx@xx.com   $5.00
select * from Table2 
left join
(select 
Table1.serialnumber as "num", 
Table1.CustID as "numid",
Table3.purchasedate,
Table3.email, 
sum(Table3.Sale)
from 
Table3, Table1 
where Purchasedate between 
date(xx/xx/xxxx) and date(xx/xx/xxxx) 
and Table3.SerialNumber = num)) tblxxx on CustID using numid)
where joindate between date(xx/xx/xxxx) and date(xx/xx/xxxx);

我的预期结果如下:

 CustID  Address   Name    Joindate  num   numid   purchasedate  email  Sale
   1      xxxx     xxx     xx/xx/xx  1261    1       xx/xx/xx   x@x.com  $390
   2      xxxx     xxx     xx/xx/xx  6337    2       xx/xx/xx   x@x.com  $72
   3      xxxx     xxx     xx/xx/xx  1412    3       xx/xx/xx   x@x.com  $15

【问题讨论】:

  • 您的预期结果是什么样的?
  • 'date(xx/xx/xxxx)' 有什么作用?
  • 此外,您应该在每个帖子中只问 1 个问题。您问了 3 个问题并希望为您的问题找到解决方案,因此我只了解您的 2 个问题和您的问题,其他人将不得不回答剩下的问题。
  • 用 exes 填充样本数据并不能帮助清晰。这很反常,不是吗?

标签: mysql join


【解决方案1】:
SELECT
    *
FROM
    table2
INNER JOIN table1 ON table1.CustID = table2.CustID
INNER JOIN (
    SELECT
        SerialNumber,
        SUM(Sale) AS sales
    FROM
        table3
    WHERE
        Purchasedate BETWEEN date(xx / xx / xxxx)
    AND date(xx / xx / xxxx)
    GROUP BY
        SerialNumber
) AS table3 ON table3.SerialNumber = table1.serialnumber
WHERE joindate BETWEEN date(xx / xx / xxxx) AND date(xx / xx / xxxx);

使用 CustID 将 table1 加入 table2。

使用序列号将table3中按序列号分组的销售额SUM加入table1。通过使用WHERE-clause,您可以指定要考虑哪些销售。

在外部查询中添加“WHERE”子句。

2.) 即使我没有在 select 语句中提取一列数据,我是否可以在 where 语句中创建 mysql 引用数据? (虽然我在 from 语句中引用了该表)。

是的。 SELECTWHERE 子句相互独立。你甚至可以在你的WHERE子句中写1 = 1之类的东西。还有类似SELECT "abcds345234" 的作品。

3.) 如果我在 from 语句中将 table2 重命名为“tb2”。将来在嵌套的 select 语句中,我是否仍将 table2 称为 “tb2”?

您想为表指定别名。当您再次尝试引用它时,您必须注意您正在移动的上下文。

如果您在同一个SUBSELECT 中,则使用相同的别名来引用它。如果您已离开 SUBSELECT,则必须检查表的当前名称。

【讨论】:

  • 非常感谢。我非常感谢您的时间和帮助。您对表别名的解释进一步使我的查询更具可读性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-15
  • 2021-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多