【问题标题】:Multiple MySQL Table JOINS needs to concat the results of 1 table into a single column field多个 MySQL Table JOINS 需要将 1 个表的结果拼接成单个列字段
【发布时间】:2015-12-15 23:36:11
【问题描述】:

我在下面有这个 SQL 查询,它从 MySQL 数据库表中获取我的所有订单记录,并为nam_order_items 数据库表中的每条记录获取order_idorder_numberitem_status 列。

然后它将上表中的order_idsales_flat_order_address 表中的parent_id 字段连接起来,以获取我的nam_order_items DB 表中所有订单的送货地址数据。

到目前为止,一切都按我的需要运行......

SELECT sfo.order_id, sfo.order_number, sfo.item_status, shipping.city 
FROM nam_order_items AS sfo
JOIN sales_flat_order_address AS shipping ON shipping.parent_id = sfo.order_id
AND shipping.address_type =  'shipping'

现在要添加到此 SQL,我还需要加入并查询另一个第三个数据库表,以获取所有相关的 comments 以获取订单记录。

订单 cmets 存储在此 DB 表 sales_flat_order_status_history 中的 comment 列下。

所以我在上面的 SQL 中添加了另一个 JOIN,如下所示...

SELECT sfo.order_id, sfo.order_number, sfo.item_status, shipping.city, comments.comment
FROM nam_order_items AS sfo
JOIN sales_flat_order_address AS shipping ON shipping.parent_id = sfo.order_id
AND shipping.address_type =  'shipping'
JOIN sales_flat_order_status_history AS comments ON comments.parent_id = sfo.order_id

现在这会将我原来的 6,000 条记录转换为 40,000 条记录。原因是每个订单记录可以有多个评论记录。

不过,我需要做的是确保在我的结果中只返回我原来的 6,000 条订单记录。我需要从sales_flat_order_status_history 表中获取每个订单的所有评论记录,并以某种方式将它们连接到结果中的 1 cmets 字段中。

所以如果一个订单有1条评论记录或者6条评论记录,它会将6合为1并显示在订单记录上。

这是否可能仅使用 SQL,如果可以的话,有人可以帮助修改我所拥有的吗?


以下用户 LOCK 回答中的工作 SQL...

SELECT sfo.order_id, sfo.order_number, sfo.item_status, shipping.street, shipping.city, shipping.region, shipping.country_id, comment.created_at, comment.comment
FROM nam_order_items AS sfo
JOIN sales_flat_order_address AS shipping ON shipping.parent_id = sfo.order_id
AND shipping.address_type =  'shipping'
JOIN
(
  select
    parent_id
    group_concat(comment order by parent_id asc separator ' | ') as comment
  from
    sales_flat_order_status_history
  group by
    parent_id
) comment ON 
  comment.parent_id = sfo.order_id

【问题讨论】:

  • 是的,前提是您的 cmets 不超过 group_concat 的最大长度值。 ...您可以使用 Group_Concat Group_Concat(comments.comment, ORDER BY CommentOrder ASC SEPARATOR ' ') 假设您有一个用于 cmets 顺序的字段。命名为commentOrder(或相应调整)

标签: mysql sql database magento join


【解决方案1】:

试试这样的: group_concat(comments order by id asc separator ' ') as comment

请注意,order by id 应该是注释的 id(因此连接时 cmets 的顺序正确)。 :

SELECT sfo.order_id, sfo.order_number, sfo.item_status, shipping.city, comments.comment
FROM nam_order_items AS sfo
JOIN sales_flat_order_address AS shipping ON shipping.parent_id = sfo.order_id
AND shipping.address_type =  'shipping'
JOIN
(
  select
    parent_id,
    group_concat(concat(created_at, ' - ', comment) order by entity_id asc separator ' ') as comment
  from
    sales_flat_order_status_history
  group by
    parent_id
) comments ON 
  comments.parent_id = sfo.order_id

【讨论】:

  • 谢谢!只需几个小改动,它就可以根据我的需要工作!我想做 1 个补充,也许你可以帮忙,因为我的尝试没有奏效。我想从 cmets 添加一个 created_at 字段,并让它显示在每个评论数据之前。我已将您的 SQL 的固定版本添加到问题的末尾。您能帮忙从sales_flat_order_status_history 表中添加这个新的created_at 字段吗?
  • 我试图改变这一行 group_concat(comment order by parent_id asc separator ' | ') as comment 通过添加 created_at, 到它像这样 1group_concat(created_at, comment order by parent_id asc separator ' | ') as comment 希望它会得到创建的日期时间字段并插入到 cmets 但它给出了这个错误#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'group_concat(created_at, comment order by parent_id asc separator ' | ') as comment from ' at line 9
  • 您希望它作为单独的行还是评论文本的一部分? cmets.comment 中每一行的值是否不同?
  • 它是 cmets 中每一行的不同值,是的,我希望它只是生成的 cmets 文本的一部分,因此如果可能,它会显示每个评论之前的日期和时间。到目前为止,我所有的尝试都失败了。感谢您的时间和帮助
猜你喜欢
  • 1970-01-01
  • 2012-11-29
  • 2011-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-31
相关资源
最近更新 更多