2011-05-24 84 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