我有3个这样的表(在这里简化为ofc):
用户与信息有一对一的关系,但信息并不总是有相关条目。
用户与联系人之间存在一对多关系,但联系人并不总是有相关条目。
我知道我可以通过左连接获取正确的'用户'+'信息',有没有办法立即获得我想要的所有数据?
例如,一条返回的记录可能是:
user_id: 5
user_name: tom
info_id: 1
rate: 25.00
contact_id: 7
contact_data: 555-1212
contact_id: 8
contact_data: 555-1315
contact_id: 9
contact_data: 555-5511
单个查询是否可以实现?或者我必须使用多个?
答案 0 :(得分:5)
可以在一个查询中执行您所要求的操作,但是您需要一个可变数量的列,这是邪恶的,因为SQL不是为此设计的,或者您必须有一个固定的数字列,这更加邪恶,因为你可以选择没有合理固定数量的列。
我建议使用以下两种方法之一:
1。为每个联系人数据返回一行,重复其他列中的数据:
5 tom 1 25.00 7 555-1212 5 tom 1 25.00 8 555-1315 5 tom 1 25.00 9 555-5511
这个问题当然是冗余数据通常是个坏主意,但是如果你没有太多冗余数据就可以了。在这里使用你的判断。
2。使用两个查询。这意味着周转时间稍长,但传输的数据较少。
在大多数情况下,我更喜欢第二种解决方案。
您应该尽量避免在循环中进行大量查询。这几乎总是可以重写为单个查询。但是,如果使用两个查询是解决问题的最自然的方法,那么只需使用两个查询。不要为了减少查询次数而尝试将所需的所有数据填充到单个查询中。
答案 1 :(得分:2)
每行结果必须具有相同的列,因此您不能聚合多行的联系人而不包含其他列。
希望这个查询可以满足您的需求:
SELECT
u.user_id as user_id,
u.user_name as user_name,
i.info_id as info_id,
i.rate as rate,
c.contact_id as contact_id,
c.contact_data as contact_data
FROM users as u
LEFT JOIN info as i ON i.user_id = u.user_id
LEFT JOIN contacts as c ON c.user_id = u.user_id