在这种情况下我应该使用左连接吗?

Posted

技术标签:

【中文标题】在这种情况下我应该使用左连接吗?【英文标题】:Should I use left join in this situation? 【发布时间】:2020-05-15 12:38:12 【问题描述】:

(php) 我有一个带有主表的数据库,还有一个表,其值对应于主表中的特定行。请在下面查看这些表格的简化版本:

table 'master'
id

table 'times'
id
master_id
type
amount

'master'中的某些行在'times'中没有对应的行,而其他行有多个对应的行。

我要做的是显示'master'的id,然后在'times'中为每个'type'添加'amount'列。

我考虑过使用 LEFT JOIN,我最终会得到这个(例如):

$query = "SELECT master.id, times.type, times.amount 
FROM master
LEFT JOIN completion_times ON master.id = completion_times.ticket_id
ID            TYPE          AMOUNT
1             NULL          NULL
2             "a"           30
2             "b"           20
etc. (hundreds of rows)

但我真的需要这样的结果:

array() 
  [0]=>
  array() 
    ["id"]=>
    string(5) "2"
    ["times"]=>
    array() 
      array() 
          ["type"]=>
          string(5) "a"
          ["amount"]=>
          string(5) "30"
      
      array() 
          ["type"]=>
          string(5) "b"
          ["amount"]=>
          string(5) "20"
      
    

是否可以编写一个 SQL 查询来完成这样的事情?或者我应该只对所有主行执行一次 foreach,并在该循环内进行辅助查询,以提供“times”表中的相应行?或者也许有另一种理想的方式来做到这一点?

【问题讨论】:

好吧,为什么我被否决了?我尽我所能写得很好,我很高兴改进它。请告诉我我可以做些什么来让它变得更好。 不要进行迭代查询!!! 不是我的反对意见,但是您的查询在哪里使用 GROUP BY 子句和 SUM() 调用?我不确定你被困在哪里。您想显示所有主 ID 吗?可能有0 计数?供志愿者使用的 dbfiddle 演示链接在哪里? ***.com/q/41230921/2943403 , ***.com/a/50516267/2943403 【参考方案1】:

LEFT JOIN 将是在这种情况下使用的适当 JOIN。由于您需要在times 表中按type 分组(可能是NULLLEFT JOIN 之后),因此在子查询中进行聚合可能更简单:

SELECT m.id, COALESCE(t.type, '') AS type, COALESCE(t.amount, 0) AS amount
FROM master m
LEFT JOIN (SELECT master_id, type, SUM(amount)
           FROM times
           GROUP BY master_id, type) t ON t.master_id = m.id

请注意,当times 中没有相应的行时,我在查询的外部级别添加了COALESCE 以创建可打印的值。您可能希望忽略它,以便在这种情况下返回 NULL 值,因为这可能更适合您的 PHP 代码进行测试)。

【讨论】:

以上是关于在这种情况下我应该使用左连接吗?的主要内容,如果未能解决你的问题,请参考以下文章

我可以在不返回条件列的情况下进行左连接吗?

太多的左连接是代码味道吗?

左连接查询未按计划进行

带有选项的光滑左/右/外连接

在这种情况下我应该使用导航控制器吗?

如何在laravel eloquent中为左连接表起别名