MySQL的理解与加入表分组

时间:2019-03-24 04:23:01

标签: mysql

所以我有带有字段id, order_number, order_name的“主”表(A)和带有字段id, fk.order_number, tracking_number的表(B)

表(A)负责跟踪每个订单,而表(B)存储每个订单的所有关联跟踪信息。

我要完成的工作是查询表A中的每个订单并将表B联接起来以显示已为每个订单存储的第一个跟踪号,几乎类似于限制1(仅返回每个存储的第一个跟踪号)订单)。

我目前的操作方式是在order_number字段上进行表A和表B之间的联接,但是我在语句末尾使用了GROUP BY tableA.order_number

select tablea.order_number, tablea.order_name, tableb.tracking_number
from tablea
join table b
on tablea.order_number = tableb.order_number
group by tablea.order_number

我猜想问题围绕着,当您从联接表返回多行时,默认的排序组是什么? 例如,在表A中只有1行,而在故事B中则有2行(该订单有2个跟踪编号)。因此,在这种情况下进行分组时,是否总是从条件匹配分组依据的联接表中获取第一个匹配项?如果删除分组依据,将返回2行。

我意识到发生了什么事情,因为我在tableA上按条件进行了分组,因此它仅显示第一行,因为从联接返回的两行都具有相同的订单号,这似乎是我想要的(限制1跟踪)每个订单号),但我不确定是否通过编程方式是否确实正确地执行了此操作,或者是否以这种方式发生了此操作,因为这是group by子句的工作方式以及在此使用的方式。我只想根据表A的order_number限制tableB中的1个跟踪号。

已更新(带有示例查询)

SELECT m.message_id, m.message_date, m.message_order_number, m.message_purchase_order, m.message_vendor_invoice, ve.vendor_email_display, concat(c.customer_first_name, ' ', c.customer_last_name) as customer_name,
min(ti.tracking_information_id) as tracking_information_id, ti.tracking_information_tracking_number, ti.tracking_information_tracking_number_status
FROM email.message m
JOIN email.customer c
ON m.message_tagged_customer_first = c.customer_id and m.message_tagged_customer_last = c.customer_id
JOIN vendor_email ve
ON m.message_sender = ve.vendor_email_id
LEFT JOIN tracking_information ti
ON m.message_order_number = ti.tracking_information_order_number
group by m.message_order_number

在这种情况下,我想返回消息表中的所有信息,并返回表跟踪中的第一个匹配行

1 个答案:

答案 0 :(得分:0)

用于聚合函数的分组byis为MIN(),MAX(),COUNT()。 ..并且用于定义必须执行聚集功能的哪一列。

如果您要查找特定的有序结果,则应按原样使用ORDER BY来处理列值

select tablea.order_number, tablea.order_name, tableb.tracking_number
from tablea
join table b on tablea.order_number = tableb.order_number
order  by tablea.order_number