我有一张表product_checklist
,其中包含核对表项目。
我想一直抓住这个,但是如果表ap_checklists
中的ap_id存在任何列表项,那么抓住created_date
下面的当前声明需要某种优先权可能在哪里? 是否可以在一个查询中执行此操作?
SELECT
`product_checklists`.*,
`ap_checklists`.`ap_id`,
`ap_checklists`.`created_date`
FROM (`product_checklists`)
LEFT OUTER JOIN
`ap_checklists` ON `product_checklists`.`check_id` = `ap_checklists`.`check_id`
WHERE
`ap_checklists`.`ap_id` = 195 OR `product_id` = 3
GROUP BY
`product_checklists`.`check_process` ORDER BY `product_checklists`.`check_order`
答案 0 :(得分:1)
如果你没有在group by或aggregate中指定一个列,MySQL基本上会抓取一个colum的随机值。如果您使用max
,则保证选择非空值(如果可用):
max(`ap_checklists`.`created_date`)
答案 1 :(得分:0)
哪里错误 - ap_checklists
。ap_id
= 195应阅读
`product_checklists`.`ap_id` = 195
因为您过滤了左连接的右侧,并且有效地将左连接转换为内连接。
答案 2 :(得分:0)
你的where子句有一个错误,因为你正在使用一个左连接表而你不应该
如果你想在标准sql中写它应该是:
FROM (`product_checklists`)
LEFT OUTER JOIN `ap_checklists` ON `product_checklists`.`check_id` = ap_checklists`.`check_id` AND (`ap_checklists`.`ap_id` = 195 OR `product_id` = 3)
在Oracle的SQL中,您可以将其编写为:
FROM `product_checklists`, `ap_checklists`
WHERE `product_checklists`.`check_id` =(+) `ap_checklists`.`check_id`
AND (`ap_checklists`.`ap_id` (+)= 195 OR `product_id` = 3)