2011-05-24 90 views
3

我有以下查詢。GROUP BY優先於MySQL

$query_assignments = "SELECT * FROM tb_scheduler_assignments 
         WHERE company_id = '".$company_id."' OR 
         dept_id = '".$dept_id."' OR 
         user_id = '".$user_id."' ORDER BY 
         due_date GROUP BY purchase_id"; 

我想什麼是一個單一的查詢解決方案,將保持對user_id結果超過dept_iddept_id超過company_id

例如:

  • 如果發生相同purchase_id用於經由dept_iduser_id共獲得該 行,那麼我只要用於user_id結果 ;
  • 如果出現了通過company_iduser_id得到了該 行相同purchase_id,然後我只希望 結果爲user_id

回答

1

首先,你插變量在SQL,這表明你可能容易受到SQL注入的影響。只想確認一下。 PHP應該提供準備好的語句,或者一些轉義函數。

其次,您的SQL語句不會編譯,因爲您使用的是GROUP BY a,但選擇了*,其中至少包含三列。第三,這聽起來像是你誤解了SQL,認爲它可能在你試圖編制的查詢中(如沒有UNION ALL)檢索重複的行,即多次讀取同一行,因爲它匹配多個標準。事實並非如此。

+1

'SELECT * ... by'將在MySQL工作組。未分組行的返回行是未定義的,但通常是第一個找到的 – knittl 2011-05-25 12:22:19

+0

@knittl - 您說得對,這將在MySQL中「工作」。它甚至會允許你通過指定一個不相關的'ORDER BY'來強制min或者max的值出現在其中一個colums中。整潔的黑客確實。 : -/ – Lumi 2011-05-25 13:49:34

+0

感謝您的回覆,並對我的回覆延遲表示歉意。你的觀點正確。我會發布我最終做的事情。謝謝。 – Kevin 2011-06-03 01:58:39

0

我一直在尋找的「單一查詢」解決方案似乎並不存在,或者如果它確實存在,它會比在PHP中處理所有排序要慢。 因此,我運行了3個單獨的查詢,將它們分別放入數組中,然後爲了將它們全部放入具有所需層次結構的最終數組中,我在下面的循環中查看是否存在用於級別的purchaseID層次結構。如果沒有,那麼我把它放入陣列。

$finalArray = array(); 
foreach ($companyArray as $purchaseID => $companyData) { 
    if (empty($deptArray[$purchaseID]) && empty($userArray[$purchaseID])) { 
     $finalArray[] = $companyData; 
    } 
} 
foreach ($deptArray as $purchaseID => $deptData) { 
    if (empty($userArray[$purchaseID])) { 
     $finalArray[] = $deptData; 
    } 
} 
foreach ($userArray as $purchaseID => $userData) { 
    $finalArray[] = $userData; 
} 

然後我可以對該數組進行排序,但是我希望通過該數組進行循環來回應我需要的內容。 不知道這是否是最好的方式,但它運作良好,對我來說閃電般快。

0
$query_assignments = "SELECT *, 
         IF(user_id = {$user_id}, 30, 
         IF(dept_id = {$dept_id}, 20, 
          IF(company_id = {$company_id}, 10, 0) 
         ) 
        ) as priority 
         FROM tb_scheduler_assignments 
         WHERE company_id = {$company_id} OR 
         dept_id = {$dept_id} OR 
         user_id = {$user_id} 
         GROUP BY purchase_id 
         ORDER BY due_date, priority DESC"; 

您可以用if聲明的虛擬領域。

user_id:  30 pts 
dept_id:  20 pts 
company_id: 10 pts 
else:   0 pts 

警告:不能被索引!

語法FIX:GROUP BYORDER BY重新排序

+0

語法錯誤... – 2011-06-11 20:28:54

+0

語法錯誤已修復 – yitsushi 2011-06-11 20:52:03