一到多个数据返回 - MySQL

时间:2010-05-29 02:07:25

标签: sql mysql select one-to-many

我在一对多的关系中有2个相关的MySQL表。

客户: cust_id,cust_name,cust_notes

订单: order_id,cust_id,order_comments

因此,如果我通过PHP进行标准连接以获取所有客户及其订单,我会返回类似的内容:

  • 杰克布莱克,杰克的笔记,评论杰克的第一顺序
  • 杰克布莱克,杰克的笔记,评论杰克的第二顺序
  • 西蒙史密斯,西蒙的笔记,评论西蒙的第一顺序
  • 西蒙史密斯,西蒙的笔记,评论西蒙的第二顺序

问题是 cust_notes 是一个文本字段,可能非常大(几千字)。所以,似乎每个订单都返回该字段是不合适的。

我可以使用 GROUP_CONCAT JOINS 在单行上返回所有 order_comments 但是order_comments也是一个大文本字段,所以看来这样可能会产生问题。

我应该只使用两个单独的查询,一个用于customers表,一个用于orders表吗?

有更好的方法吗?

4 个答案:

答案 0 :(得分:0)

如果我理解你的问题,最好使用两个查询,结果如下:

Jack black
   comments
   comments
   comments
   comments

Simon Smith
   comments
   comments
   comments

答案 1 :(得分:0)

通常我们使用了一些不同的策略。

在一个案例中,我们返回了多个结果集 - 一组用于父项,一组用于所有子项。 ORDER BY是相同的,因此您可以轻松地在客户端代码中为每个父级交换子级。

也可以返回多个结果集 - 一个用于父项,一组用于EACH父项(我们在其外部使用了一个游标)。

我们使用的另一件事(在SQL Server中)是XML,因此它实际上返回了分层表单。

答案 2 :(得分:0)

您可以运行两个查询,一个用于注释,另一个用于客户详细信息。

// this will give you orders in an efficient way
SELECT cust_id, order_id, order_comments
FROM customers AS c
LEFT JOIN orders as o ON o.cust_id = c.cust_id
LIMIT xx, yy

// this will get all details from N specific customers
SELECT * FROM customers
WHERE cust_id = 'xxx' OR cust_id = 'yyy' OR cust_id = 'zzz'

然后将第二个查询传递给数组,当您显示第一个查询时,请使用存储在数组中的客户详细信息。

应该非常有效率。

答案 3 :(得分:0)

看。您的页面很像SO上的问题页面。首先回答问题并在下面给出答案 没有人愿意用一个查询来请求它!

答案 - 是的,使用加入,但仅获取名称和ID,而不是完整用户的信息 没什么复杂的。

只需对客户和订单列表使用单独的查询