2016-11-23 78 views
-1

结果删除重复我具有低于使用MySQL和PHP

SELECT A.order_no, A.order_date, 
COUNT(B.reaction_no) as tot_reaction_no, 
SUM(CASE 
WHEN (B.purification != '') THEN 1 
ELSE 0 
END) as tot_purification 
FROM order_header A 
LEFT JOIN order_reactions B ON A.order_no = B.order_no 
WHERE A.order_date BETWEEN '2015-10-01 00:00:00' AND '2016-09-01 00:00:00' 
AND A.order_no = '23746' 
GROUP BY A.order_no 

一个查询给定的,这将结果示于图片。但结果是错误的,因为一些条目是重复的。所以我必须删除重复并打印计数。计数需要的是“列”的计数从表1

enter image description here

+0

也许您可以在查询中使用distinct关键字 – DBX12

+2

[MySQL:仅选择列中的唯一值](http:// stackoverflow。 com/questions/8571902/mysql-select-only-unique-values-from-a-column) –

+0

当我使用DISTINCT –

回答

0

我建议查询

SELECT COUNT(DISTINCT clone_name) AS tot_purification, COUNT(*) AS tot_reaction_no FROM Table2 WHERE `purification`='Column' AND `order_no`=23746; 

在报价请原谅的错误,MySQL是很混乱的,当涉及到报价海事组织。

编辑:

添加tot_purification

我不知道你是为tot_reaction_no期待什么,所以我只算其中订单和纯化的比赛在我的WHERE子句中描述的所有行。

1

我认为你需要在你的选择中省略A.order_date,或者你应该把它添加到group by子句中。这给你一个不同的结果。

你也可以在你的select子句中使用子查询:

SELECT A.order_no, A.order_date, COUNT(B.reaction_no) as tot_reaction_no, (SELECT count(*) FROM order_reactions as or WHERE or.order_no=A.order_no AND purification!='') as tot_purification, (SELECT count(*) FROM order_reactions as or2 WHERE or.order_no=A.order_no) as tot_reaction_no FROM order_header A WHERE A.order_date BETWEEN '2015-10-01 00:00:00' AND '2016-09-01 00:00:00' AND A.order_no = '23746'

这只是从我的头顶,因为您的画面没有显示完整的表,我不知道这是100%是正确的,但它可能会让你指向正确的方向。

+0

似乎是一个很好的解决方案,肯定会有优化的空间,但弗兰克是对的。在不知道完整的表格结构的情况下,不可能建立一个“无法理解”的最佳查询。 – DBX12

0

它,因为你只在A.order_no分组,使下面的查询中的变化和再试一次:

将行:

GROUP BY A.order_no; 

GROUP BY A.order_no, A.clone_name;