【问题标题】:mySQL DISTINCT and JOINSmySQL DISTINCT 和 JOINS
【发布时间】:2015-06-08 19:14:46
【问题描述】:

查询

SELECT DISTINCT(o.id) as `order_line`,
  `k`.`short_name` AS `market`,
  `jc`.`code` AS `job_status`,
  `j`.`order_number` AS `job_number`,
  CONCAT('ML', `l`.`supp`) AS `supp_number`,
  `jd`.`needed_by` AS `needed_by`,
  `jd`.`mastec_onjob` AS `mastec_onjob`,
  `jd`.`revised_crcd` AS `revised_crcd`,
  `e`.`lastname` AS `install supervisor`,
  `o`.`order_number` AS `po number`,
  `o`.`order_date` AS `ordered`,
  `o`.`qty_ordered` AS `qty_ordered`,
  `o`.`ship_date` AS `vendor ship`,
  `o`.`rcvd_date` AS `rcvd_date`,
  `o`.`qty_received` AS `qty_received`,
  `m`.`mastec_partno` AS `mastec_partno`,
  `v`.`long_name` AS `vendor_name`,
  `o`.`mm_notes` AS `mm_notes`,
  `o`.`pm_notes` AS `pm_notes`,
  `o`.`rc_notes` AS `rc_notes` 
FROM
  mm_orders as o 
  LEFT JOIN `material_lists` `l` 
    ON ((`l`.`id` = `o`.`ml_id`)) 
  LEFT JOIN `jobs` `j` 
    ON ((`l`.`job_id` = `j`.`id`)) 
  LEFT JOIN `clli` `c` 
    ON ((`j`.`clli` = `c`.`id`)) 
  LEFT JOIN `markets` `k` 
    ON ((`k`.`id` = `c`.`market`)) 
  LEFT JOIN `employees` `e` 
    ON ((`e`.`employee_number` = `j`.`install_supervisor`)) 
  LEFT JOIN `job_dates` `jd` 
    ON ((`l`.`job_id` = `jd`.`job_id`)) 
  LEFT JOIN `mat_r12` `m` 
    ON ((`o`.`ci_id` = `m`.`id`)) 
  LEFT JOIN `vendors` `v` 
    ON ((`v`.`id` = `m`.`vendor_id`)) 
  LEFT JOIN `ml_contents` `mc` 
    ON ((`l`.`id` = `mc`.`ml_id`)) 
  LEFT JOIN `job_status_codes` `jc` 
    ON ((`j`.`status` = `jc`.`id`)) 
WHERE o.qty_ordered > o.qty_received 
  AND `j`.`status` IN (1, 5, 8, 11, 12, 13, 14)
  AND `mc`.`mastec_stock` = 0 
ORDER BY `j`.`order_number`,
  `l`.`id`,
  `l`.`supp`,
  `o`.`vendor_id`;

我希望结果只反映每个 o.id 的一行,但这根本不是我得到的。当我删除GROUP BY 时,我得到了 63391 行,而有了它,我只得到了 188 行。当我运行SELECT id FROM mm_orders WHERE qty_ordered > qty_received 时,我在 1249 处得到了正确的行数。显然,我不是我认为的 MySQL 大师。是我的JOINs 还是我刚刚完全搞砸了从一端到另一端的查询?

如果层次不明确,从上到下:job->material_list->ml_contents。多个material_lists可以分配同一个job_id,多个ml_contents在同一个material_list内。下表具有一对一的关系:job-> job_dates、ml_contents-> mm_orders。所有其他的应该是不言自明的,但是如果有一个很好的 jsFiddle 类型的工具用于 MySQL,我很乐意发布每个表的结构。

查询已更新

【问题讨论】:

    标签: mysql join group-by distinct


    【解决方案1】:

    这是连接。您使用了内部连接,但可能有些订单没有材料清单或安装程序或其他任何东西。这些订单不会出现在最终结果中,导致它下降到 188 个唯一订单。

    此外,如果订单的作业有多个作业日期,您将在每个作业日期的结果中获得该订单。这将导致 188 个唯一订单的最终结果显示为 63391 行。

    因此,与其应用分组和区分来尝试解决它,不如先问问自己要查询的是什么。您想要一份独特的订单列表,还是想要额外的信息?如果是后者,请注意查询包含例如订单行或工作日期,并且订单信息本身可能重复。

    【讨论】:

    • 我还在玩QUERY。我现在在开头使用SELECT DISTINCT(o.id),并将所有JOINs 转换为LEFT JOINs。现在我得到 201 行。正确的行数(基于我的 OP 中提到的 mm_orders 表的直接查询)是 1249。这是我想要的结果集中有多少结果,是的,我需要所有额外的数据也在那里,因为结果集被存储为VIEW
    • 但是所有这些连接以及WHERE 子句中的条件都会影响行数。您验证 quantityOrdered 和 quantityDelivered 并检查作业的状态。所以很明显这会影响结果。
    • 啊,你是对的。 WHERE 条件是关键标准,我没有考虑会从 1249 减少的行数。但是,我肯定 200 太少而 63391 太多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-28
    • 2015-06-16
    • 2015-04-05
    • 2016-10-24
    • 2021-10-30
    • 2021-07-04
    相关资源
    最近更新 更多