【问题标题】:Mysql Self-join eludes meMysql Self-join 让我望而却步
【发布时间】:2015-05-21 01:00:15
【问题描述】:

我一直在这些论坛上徘徊,一直在寻找有关 Joins 和 Sub_queries 的提示并储存了解决方案,但我一直遇到一些看似简单但我却无法理解的问题。

这几天搜索这个论坛没有得到我的答案。

所以,这里是:

我有一张表,其中有一个键 ID、一个人的 Name 和一个名为 Status

的字段

我需要使用通常的别名将这个表连接到自身并简单地显示 rows 。

到目前为止,我可以得到“约会”上的正确计数或“失败”上的正确计数,但我的 JOINS 无法将它们全部放在一起,因此它看起来很完整,如下图所示:

id    |姓名              |约会(来自状态值)|失败(来自状态值)
36 |布拉德·琼斯      | 78                                          | 37
45 |雪莉·阿特沃特 | 56                                           | 44
47 |杰克布里尔           | 33                                          | 60
53 |诺姆·约翰逊 | 17                                          | 26

我可以得到一列的id, 其中一个名字, 状态值中的一个,即具有“约会”AS # 约会的约会计数 或者我可以获取 Status LIKE 'No Interest' 的 Status 列行数 但我无法加入

我使用这样的查询和许多变体来获得 4 列中的 3 列,但是当我超越尝试加入时,我迷失了方向......所以我在这里备份并只显示一个查询,该查询可用于获取 Appointments 的数量或通过更改 status 值可以获取 Fails 的计数....

SELECT trainerid, trainername, COUNT(*) AS Appointments
FROM trainer_appointments
GROUP BY 状态,trainerid
HAVING 状态 = '约会'
ORDER BY 约会 DESC

在此表中,每个“名称”都有一个键 ID 号 所以布拉德琼斯的 id 永远是 36

我正在计算有多少行标有他的 ID 号满足状态条件,值为“约会”,并在单独的列中计算状态值“无兴趣”为失败

我也尝试过 -- HAVING Status LIKE 'Appointment' 或
WHERE 状态如“约会”或
HAVING 状态 = '约会'

当我进一步处理此查询并尝试以自己的别名加入此表以获取 FAILS COUNT WHERE "Status LIKE 'No Interest'" GROUP BY id 时,Join 失败。

JOINS 失败并出现各种错误原因,或者查询产生错误计数。

我已经尝试调整我在这个论坛上看到的许多其他连接来解决这个简单的问题,但即使在技术上确实执行了查询,我也无法获得正确的值。

如果你们中的一位专业人士能告诉我这是多么简单,我会很高兴!

【问题讨论】:

  • 在你的困扰中,你有没有偶然发现任何你认为通常比其他问题质量更好的问题?
  • 你不需要的东西:加入。您需要做的是:将表格中的一些示例行添加到问题中。

标签: mysql join self-join


【解决方案1】:

我很冒险,猜你不需要加入,你只需要对几个不同状态的每个名称进行计数。条件聚合正是您所需要的。

select name, 
       count(case when status = 'Appointment' then 1 end) appointments,
       count(case when status = 'Fail' then 1 end) fails
from <yourtable>
group by name

demo here.

只需修改 case 语句中的条件来调整正在计算的值。

【讨论】:

  • pala_,谢谢,谢谢!我以前从未使用过案例。但是我在这些论坛中看到了一些例子,其中提供了自我加入作为解决“类似”问题的一种手段。
  • @Thunder 没问题。这是一个非常有用的技术。如果它解决了您的问题,您可以将其标记为已接受吗?
  • 显然我太新了,无法投票给你的答案,Pala_,但你的答案是我见过的最清晰、最优雅的解决方案,并且使用了我现在可以应用于许多类似问题的案例方法!再次感谢您不厌其烦地安装 sqlfiddle 演示!在没有人跳进来简单地质疑问题本身的质量的情况下,在这里提出问题是非常困难的。我鄙视这些论坛的那部分,问题秃鹰。所以,你花时间和精力来善良,非常感谢,我终于有一个有用的方法可以继续使用!
  • @Thunder 不投票 - 只需点击投票切换下方的勾号
  • 好的,谢谢,我从你那里得到了另一个有用的提示,pala_。如果可以的话,已接受答案,并在“非常感谢”处再打一个绿色复选标记。
猜你喜欢
  • 1970-01-01
  • 2021-03-02
  • 1970-01-01
  • 1970-01-01
  • 2011-03-19
  • 2015-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多