mySQL一对多查询

时间:2010-04-11 15:40:00

标签: mysql

我有3个这样的表(在这里简化为ofc):

  • 用户
    • USER_ID
    • USER_NAME
  • 信息
    • info_id
    • user_id
  • 触点
    • CONTACT_ID
    • USER_ID
    • contact_data

用户与信息有一对一的关系,但信息并不总是有相关条目。

用户与联系人之间存在一对多关系,但联系人并不总是有相关条目。

我知道我可以通过左连接获取正确的'用户'+'信息',有没有办法立即获得我想要的所有数据?

例如,一条返回的记录可能是:

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

单个查询是否可以实现?或者我必须使用多个?

2 个答案:

答案 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