GROUP BY在MySQL中优先考虑

时间:2011-05-24 22:52:23

标签: php mysql group-by

我有以下查询。

$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_id获得的行 user_id,那我只想要结果 对于user_id;
  • 如果发生相同的purchase_id 通过company_id获得的行 和user_id,那我只想要 user_id
  • 的结果

3 个答案:

答案 0 :(得分:1)

首先,您在SQL中插入变量,这表明您可能容易受到SQL注入攻击。只想确认一下。 PHP应提供预准备语句或一些转义函数。

其次,您的SQL语句将无法编译,因为您使用的是GROUP BY a,而是选择*,其中至少包含三列。

第三,听起来你误解了SQL,认为它可能会在你试图制定(没有UNION ALL)的查询中检索重复的行,即多次检索同一行,因为它符合多个标准。事实并非如此。

答案 1 :(得分: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;
}

然后我可以按照我想要的方式对该数组进行排序并循环遍历它以回应我需要的内容。 不确定这是不是最好的方式,但它运作良好,对我来说是闪电般的。

答案 2 :(得分: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重新排序