2011-03-03 72 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