Mysql 联合、左连接、分组和计数

Mysql union, left join, group and count

这是我的查询

 SELECT 
    fsi_courier_assignment_print_master_listing.master_listing_id,
    fsi_master_listing.transmittal_id,
    fsi_transmittals.product_name,
    fsi_transmittals.transmittal_id
 FROM fsi_courier_assignment_print_master_listing
 LEFT JOIN fsi_master_listing ON fsi_courier_assignment_print_master_listing.master_listing_id = fsi_master_listing.master_listing_id
 LEFT JOIN fsi_transmittals ON fsi_master_listing.transmittal_id = fsi_transmittals.transmittal_id
 WHERE dispatch_code_id=".$this->db->escape($dispatch_code_id)."
 UNION ALL
 SELECT 
    fsi_courier_assignment_print_master_listing_undelivered.master_listing_id,
    fsi_master_listing.transmittal_id,
    fsi_transmittals.product_name,
    fsi_transmittals.transmittal_id
 FROM fsi_courier_assignment_print_master_listing_undelivered
 LEFT JOIN fsi_master_listing ON fsi_courier_assignment_print_master_listing_undelivered.master_listing_id = fsi_master_listing.master_listing_id
 LEFT JOIN fsi_transmittals ON fsi_master_listing.transmittal_id = fsi_transmittals.transmittal_id
 WHERE dispatch_code_id=".$this->db->escape($dispatch_code_id)."

fsi_courier_assignment_print_master_listing table

  master_listing_id   dispatch_code_id
          2                 2
          5                 2
          36                2
          37                2
          134               2
          135               2
          136               2
          137               2
          138               2
          139               2
          140               2

fsi_courier_assignment_print_master_listing_undelivered table

  master_listing_id   dispatch_code_id
          1                 2

fsi_master_listing table

  master_listing_id   transmittal_id
          1                 1
          2                 1
          5                 2
          36                2
          37                2
          134               3
          135               3
          136               3
          137               3
          138               3
          139               3
          140               3

fsi_transmittals table

  transmittal_id   product_name
        1             Name 1
        2             Name 2
        3             Name 3

我想做的是从 fsi_courier_assignment_print_master_listingfsi_courier_assignment_print_master_listing_undelivered 中获取产品的组合结果,其中 dispatch_code_id='2' 并计算它们

我的期望输出是

  Product Name    Product Count
     Name 1            2
     Name 2            3
     Name 3            7

提前致谢,希望有人能帮我解决这个问题..

您的查询没问题,您只需要:

  • 添加 COUNTGROUP BY product_name 并将您的查询作为子查询。
  • transmittal_id在两个联合查询中指定了两次,要么删除其中一个,要么给它们不同的名称(在MySQL中可能工作正常,但建议不要这样做所以)。

所以您的查询将是这样的:

SELECT
  t.product_name,
  COUNT(*) AS ProductCount
FROM
(
    SELECT 
        ml.master_listing_id,
        m.transmittal_id,
        t.product_name
     FROM fsi_courier_assignment_print_master_listing AS ml
     LEFT JOIN fsi_master_listing AS m 
                                  ON ml.master_listing_id = m.master_listing_id
     LEFT JOIN fsi_transmittals AS t 
                                ON m.transmittal_id = t.transmittal_id
     UNION ALL
     SELECT 
        u.master_listing_id,
        m.transmittal_id,
        t.product_name
     FROM fsi_courier_assignment_print_master_listing_undelivered as u 
     LEFT JOIN fsi_master_listing AS m 
                                  ON u.master_listing_id = m.master_listing_id
     LEFT JOIN fsi_transmittals AS t 
                                ON m.transmittal_id = t.transmittal_id
) AS t
GROUP BY t.product_name;

这会给你: