【问题标题】:Decrease the number of joins to the same parent table in mysql减少mysql中同一个父表的连接数
【发布时间】:2016-07-26 16:32:18
【问题描述】:

我有一个包含用户信息的用户表和一个签名表,该表使用用户 ID 映射到用户表,如下所示

用户 用户名 |名字 |姓 1 |约翰 |磷 2 |皮特 | C 3 |蒂姆 | D 标志 完成者 |检查人 |经核实 1 | 2 | 3

有没有更好的方法来代替下面的多个连接, 考虑到我会有 6 个这样的连接

选择 concat(usr1.firstname, ' ', usr1.lastname) as doneby, concat(usr2.firstname, ' ', usr2.lastname) 作为checkby, concat(usr3.firstname, ' ', usr3.lastname) 验证人 从标志sgn 加入用户 usr1 (usr1.userid = sgn.doneBy) 加入用户 usr2 (usr2.userid = sgn.checkedBy) 加入用户 usr3 (usr3.userid = sgn.verifiedBy)

【问题讨论】:

  • 你为什么在乎?您的表中有数百万行吗?
  • 你在乎什么是什么意思? A) 学习和 B) 使用尽可能少的资源总是更好! @DirkHorsten
  • 您的编程时间也是一种资源,更重要的是您的继任者了解它的时间是一种资源。 Sagi 的回答得到了我的支持,但是如果所有表的行数都少于一百,那么编写它的成本就会超过执行你的成本。然后我建议不要使用它。
  • @DirkHorsten,您不必重新发明轮子,但您当然可以检查上面的橡胶。是的,这张表很快就会触及数百万条记录,现在至少你还有另一种方法可以做到,

标签: mysql join


【解决方案1】:

您可以使用CASE EXPRESSION 进行条件聚合,如下所示:

SELECT MAX(CASE WHEN t.doneBy = t.userId THEN t.full_name END) AS doneBy,
       MAX(CASE WHEN t.CheckedBy = t.userId THEN t.full_name END) AS doneBy,
       MAX(CASE WHEN t.VerifiedBy = t.userId THEN t.full_name END) AS doneBy
FROM (
     SELECT u.userid,concat(u.firstname, ' ', u.lastname) as full_name,u.*
     FROM signs s
     INNER JOIN users u
      ON(s.userid IN(s.doneBy,s.CheckedBy,s.VerifiedBy))) t
GROUP BY t.doneBy,t.checkBy,t.VerifiedBy

【讨论】:

  • 谢谢,@Sagi 让我检查一下。
  • 查询成功了,我已经更新了您对运行查询的回答,感谢您的帮助
猜你喜欢
  • 2021-01-12
  • 2022-09-30
  • 1970-01-01
  • 2012-11-30
  • 1970-01-01
  • 1970-01-01
  • 2012-04-12
  • 2013-02-27
  • 1970-01-01
相关资源
最近更新 更多