【问题标题】:Multiple queries in one mysql (Using datatable or not)一个mysql中的多个查询(是否使用数据表)
【发布时间】:2019-03-22 04:38:54
【问题描述】:

在我的数据库中,我有 4 个表:

主表:

P(T_P, T, P, title)

还有另外 2 个表与 T_P 链接:

E(T_P, EE, AA, BB)
G(T_P, CC, DD, EE)

还有另一个表D,带有TYPE 参数。

在我的结果中,我希望有 3 列基于 3 类型。

为了显示,我使用带有服务器端处理的数据表,因为P 表有 500.000 行。

实际上,没有数据表,我使用 4 个不同的查询:

  • 一个用于获取表 P、表 D 和表 E 参数。
  • 用于获取类型 A 的表 D
  • 一个用于获取类型 B 的表 D 和
  • 一个用于获取类型 C 的表 D。

这些很好用,但我需要使用数据表。

不知道自己说得够不够清楚,所以画了一个小架构。

【问题讨论】:

  • 您可以通过提供语句来创建您绘制的模式来大大改善您的问题。大多数用户不会自己重新创建您的架构,因此提供这将允许用户使用经过全面测试的示例来回答您的问题。
  • 提供样本数据以及从该样本数据中查询所需的结果也会对您有所帮助。也可以提供您当前正在使用的查询。
  • 将表格和数据发布为文本READ THIS
  • 请给makejob更容易的创建表查询

标签: php mysql sql datatable


【解决方案1】:

这应该让你接近你需要的东西。我能问一下你为什么不对表/列使用详细的名称吗?你只是在创造自己的生活,而接下来接手这个项目的人的生活要困难得多。

SELECT tP.T_P,
       tP.T,
       tP.P,
       tP.Title,
       tE.EE,
       tG.CC,
       tDa.X AS A,
       tDb.X AS B,
       tDc.X AS C
FROM P AS tP
LEFT JOIN E AS tE ON tP.T_P = tE.T_P
LEFT JOIN G AS tG ON tP.T_P = tG.T_P
LEFT JOIN D AS tDa ON tP.T = tDa.T AND tP.P = tDa.P AND tDa.Type = 'A'
LEFT JOIN D AS tDb ON tP.T = tDb.T AND tP.P = tDb.P AND tDb.Type = 'B'
LEFT JOIN D AS tDc ON tP.T = tDc.T AND tP.P = tDc.P AND tDc.Type = 'C'

【讨论】:

  • 这个答案没有提供期望的输出。在这里,您将每个 X 放在不同的行中,而不是在最后一张图片中显示的同一行
  • 编辑了答案,现在试试,有 tDa.A tDb.BtDc.C 而不是 tDa.X tDb.XtDc.X
  • 不,那样不行。你在 P 和 D 之间做笛卡尔积,所以每个 D 都有一行。这就是为什么我的答案是 GROUP BY
  • @JuanCarlosOropeza 不是笛卡尔连接,再看一遍。只有当表 D 有多行具有相同的 T、P 和 Type 值时,您才会得到多行。
  • 别担心,当 OP 只提供屏幕截图时,检查这些东西并不容易。
【解决方案2】:
SELECT P.T_P,
       P.T,
       P.P,
       P.Title,
       E.EE,
       G.CC,
       MAX(CASE WHEN D.Type = 'A' THEN X END) as A,
       MAX(CASE WHEN D.Type = 'B' THEN X END) as B,
       MAX(CASE WHEN D.Type = 'C' THEN X END) as C
FROM P 
LEFT JOIN E ON P.T_P = E.T_P
LEFT JOIN G ON P.T_P = G.T_P
LEFT JOIN D ON P.T = D.T 
         AND P.P = D.P 
GROUP BY 
       P.T_P,
       P.T,
       P.P,
       P.Title,
       E.EE,
       G.CC

【讨论】:

  • 您没有为上次连接指定表。
猜你喜欢
  • 1970-01-01
  • 2012-01-13
  • 1970-01-01
  • 2017-02-18
  • 2012-06-06
  • 2019-08-29
  • 1970-01-01
  • 2018-02-15
相关资源
最近更新 更多