【问题标题】:mySQL one-to-many querymySQL 一对多查询
【发布时间】:2010-04-11 23:58:15
【问题描述】:

我有 3 个类似这样的表(此处为 ofc 的简化表):

  • 用户
    • user_id
    • 用户名
  • 信息
    • info_id
    • user_id
  • 联系人
    • contact_id
    • user_id
    • contact_data

users 与 info 具有一对一的关系,尽管 info 并不总是具有相关条目。

用户与联系人是一对多的关系,尽管联系人并不总是有相关条目。

我知道我可以通过左连接获取正确的“用户”+“信息”,有没有办法一次获取我想要的所有数据?

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

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

这可以通过单个查询来实现吗?还是必须使用多个?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    可以在一个查询中执行您所要求的操作,但是您要么需要可变数量的列,这是邪恶的,因为 SQL 不是为此而设计的,要么您必须有一个固定数量列数,这更加邪恶,因为没有合理的固定列数可供您选择。

    我建议使用以下两种方法之一:

    1。为每个联系人数据返回一行,重复其他列中的数据:

    5 汤姆 1 25.00 7 555-1212 5 汤姆 1 25.00 8 555-1315 5 汤姆 1 25.00 9 555-5511

    这个问题当然是冗余数据通常是一个坏主意,但如果你没有太多的冗余数据就可以了。在这里使用您的判断。

    2。使用两个查询。这意味着周转时间稍长,但要传输的数据更少。

    在大多数情况下,我更喜欢第二种解决方案。

    您应该尽量避免在循环中进行大量查询。这几乎总是可以重写为单个查询。但是,如果使用两个查询是解决问题的最自然方法,那么只需使用两个查询。不要为了减少查询的数量而试图将您需要的所有数据塞进一个查询中。

    【讨论】:

      【解决方案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
      

      【讨论】:

      • 我刚刚在我的数据库上构建了一个实际查询,它产生了大量冗余数据,这为我提供了我需要的所有数据,但似乎有点矫枉过正。我想我将使用两个查询方法,但是很高兴学习如何正确地实际构建具有多个连接的查询。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多