在这种情况下我应该使用左连接吗?
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
分组(可能是NULL
在LEFT 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 代码进行测试)。
【讨论】:
以上是关于在这种情况下我应该使用左连接吗?的主要内容,如果未能解决你的问题,请参考以下文章