【发布时间】: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