2011-03-03 36 views
0

首先,我已通读与匹配名称的帖子,并试图集成一些解决方案,但我似乎无法让这个SQL查询工作...无效的组按功能:: MySQL

这个问题似乎周围的COUNT函数围绕上线8

这..


SELECT `purchase_orders`.`purchase_order_id`,`purchase_orders`.`sequence_id`,`purchase_orders`.`order_number`,`vendors`.`name`,`purchase_orders`.`date`,COUNT(`purchase_order_items`.`purchase_order_id`) `item_count`,`purchase_orders`.`total_value`,`purchase_orders`.`status`,`users`.`first` 
FROM (`purchase_orders`, `vendors`, `purchase_order_items`,`users`) 
WHERE `purchase_orders`.`aid`='c4ca4238a0b923820dcc509a6f75849b'AND`purchase_orders`.`vendor_id`=`vendors`.`vid`AND`purchase_orders`.`created_by`=`users`.`uid`AND`purchase_order_items`.`purchase_order_id`=`purchase_orders`.`purchase_order_id` AND `purchase_orders`.`purchase_order_id` LIKE '%122%' 
OR `purchase_orders`.`aid`='c4ca4238a0b923820dcc509a6f75849b'AND`purchase_orders`.`vendor_id`=`vendors`.`vid`AND`purchase_orders`.`created_by`=`users`.`uid`AND`purchase_order_items`.`purchase_order_id`=`purchase_orders`.`purchase_order_id` AND `purchase_orders`.`sequence_id` LIKE '%122%' 
OR `purchase_orders`.`aid`='c4ca4238a0b923820dcc509a6f75849b'AND`purchase_orders`.`vendor_id`=`vendors`.`vid`AND`purchase_orders`.`created_by`=`users`.`uid`AND`purchase_order_items`.`purchase_order_id`=`purchase_orders`.`purchase_order_id` AND `purchase_orders`.`order_number` LIKE '%122%' 
OR `purchase_orders`.`aid`='c4ca4238a0b923820dcc509a6f75849b'AND`purchase_orders`.`vendor_id`=`vendors`.`vid`AND`purchase_orders`.`created_by`=`users`.`uid`AND`purchase_order_items`.`purchase_order_id`=`purchase_orders`.`purchase_order_id` AND `vendors`.`name` LIKE '%122%' 
OR `purchase_orders`.`aid`='c4ca4238a0b923820dcc509a6f75849b'AND`purchase_orders`.`vendor_id`=`vendors`.`vid`AND`purchase_orders`.`created_by`=`users`.`uid`AND`purchase_order_items`.`purchase_order_id`=`purchase_orders`.`purchase_order_id` AND `purchase_orders`.`date` LIKE '%122%' 
OR `purchase_orders`.`aid`='c4ca4238a0b923820dcc509a6f75849b'AND`purchase_orders`.`vendor_id`=`vendors`.`vid`AND`purchase_orders`.`created_by`=`users`.`uid`AND`purchase_order_items`.`purchase_order_id`=`purchase_orders`.`purchase_order_id` AND COUNT(`purchase_order_items`.`purchase_order_id`) LIKE '%122%' 
OR `purchase_orders`.`aid`='c4ca4238a0b923820dcc509a6f75849b'AND`purchase_orders`.`vendor_id`=`vendors`.`vid`AND`purchase_orders`.`created_by`=`users`.`uid`AND`purchase_order_items`.`purchase_order_id`=`purchase_orders`.`purchase_order_id` AND `purchase_orders`.`total_value` LIKE '%122%' 
OR `purchase_orders`.`aid`='c4ca4238a0b923820dcc509a6f75849b'AND`purchase_orders`.`vendor_id`=`vendors`.`vid`AND`purchase_orders`.`created_by`=`users`.`uid`AND`purchase_order_items`.`purchase_order_id`=`purchase_orders`.`purchase_order_id` AND `purchase_orders`.`status` LIKE '%122%' 
OR `purchase_orders`.`aid`='c4ca4238a0b923820dcc509a6f75849b'AND`purchase_orders`.`vendor_id`=`vendors`.`vid`AND`purchase_orders`.`created_by`=`users`.`uid`AND`purchase_order_items`.`purchase_order_id`=`purchase_orders`.`purchase_order_id` AND `users`.`first` LIKE '%122%' 
GROUP BY `purchase_orders`.`purchase_order_id` 
ORDER BY `purchase_orders`.`purchase_order_id` ASC 
LIMIT 0,1 

回答

1

当您在SQL中使用COUNT(xxx),你需要在HAVING子句中使用它:

例如

HAVING COUNT(xxx) > yyyy 

另外,一般来说,您希望GROUP BY的字段不使用聚合函数。例如:

SELECT person_name 
    , SUM(bonuses) 
    FROM person x 
    , person_bonus y 
WHERE x.person_id = y.person_id 

GROUP BY PERSON_NAME

当我添加更多的列到SELECT语句,我需要他们要么使用其他聚合函数(COUNT,SUM等),或者我需要GROUP BY他们。

再次,您使用的是一种聚合函数什么都可以你的HAVING子句中使用:

SELECT person_name 
     , SUM(bonuses) 
     FROM person x 
     , person_bonus y 
    WHERE x.person_id = y.person_id 
    GROUP BY person_name 
    HAVING SUM(bonuses) > 50000 // I wish :) 
+0

试一下...... – Peter 2011-03-03 00:42:10

0

使用规则GROUP BY子句:

  1. 列,你GROUP BY绝也在你的SELECT语句中。
  2. 由您想了解,而不是你在应用聚合函数的一个信息栏记住组。

在你例如,你正在检查purchase_order_items.purchase_order_id = purchase_orders.purchase_order_id并且也正在申请集合函数COUNT(purchase_order_items.purchase_order_id)

+0

http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html我们可以使用 – Raja 2011-03-03 00:56:06

1

尽管可能已经选择了一个解决你的问题,然而,你的查询真的不干净。 SQL的前提是在桌子上如何与给定的键,并在那里将任何额外的过滤器,一旦确定了关系。您的查询有多次“OR”。这里有一个更清晰的查询版本。注意where子句中有一个关键的“援助”你要找的,和一个单一的和子句来连接表......在查询中剩余的AND子句,你曾与LIKE“%122%”这么多的元素,其COUNT(任何东西)会返回一个数字。

SELECT 
     po.purchase_order_id, 
     po.sequence_id, 
     po.order_number, 
     v.name, 
     po.date, 
     COUNT(poi.purchase_order_id) item_count, 
     po.total_value, 
     po.status, 
     users.first 
    FROM 
     purchase_orders po, 
     vendors v, 
     purchase_order_items poi, 
     users 
    WHERE 
      po.aid = 'c4ca4238a0b923820dcc509a6f75849b' 
     AND po.vendor_id = v.vid 
     AND po.purchase_order_id = poi.purchase_order_id 
     AND po.created_by = users.uid 
    GROUP BY 
     po.purchase_order_id 
    ORDER BY 
     po.purchase_order_id 
    LIMIT 
     0, 1 

这些我不明白你在寻找,但WHERE子句我上面已经......同样,COUNT(poi.purchase_order_id)LIKE“%122%会最终被之后的所有其他“我不认为是适用的。也许其他的“ID”的基础,我将承担列是基于数字。

 AND po.purchase_order_id LIKE '%122%' 
     AND po.sequence_id LIKE '%122%' 
     AND po.order_number LIKE '%122%' 
     AND v.name LIKE '%122%' 
     AND po.date LIKE '%122%' 
     AND COUNT(poi.purchase_order_id) LIKE '%122%' 
     AND po.total_value LIKE '%122%' 
     AND po.status LIKE '%122%' 
     AND users.first LIKE '%122%' 

看来你打算适用所有的连接条件的每一个实例,但应该是 - 澄清

where 
    (all first group of conditions) 
    OR (all next group of conditions) 
    OR (all next, etc) 

我希望这有助于澄清查询是如何构成的。

+0

谢谢你的详细解释和例子。但它最初似乎更复杂。从被解析,然后由用户定义的任何选项..如搜索关键词重建,排序顺序,限制,寻呼另一个查询生成的查询..等 这里是林做.. HTTP:/ /datatables.dyndns-web.com/main/basic#TheSQL – Peter 2011-03-03 01:55:38

+1

@Peter,是的,但是从正在修建什么,你应该还是有关系的CORE查询,以及额外的WHERE部件仅钉。正如你可以从我的例子中看到,他们没有被重复,也不能打开“或”条件允许更大的问题。 – DRapp 2011-03-03 02:20:54

+0

谢谢你,我会尝试并重构这个东西建立更好的查询和不适高清使用你的例子。 – Peter 2011-03-03 02:32:53