Php MySQL中的分组优先

Php MySQL中的分组优先,php,mysql,group-by,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

我有以下疑问

$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\u id
的结果保存在
dept\u id
dept\u id

例如:

  • 如果相同的
    purchase\u id
    发生在 通过
    部门id
    获取的行,以及
    user\u id
    ,那么我只想要结果 对于
    用户id
  • 如果相同的
    purchase\u id
    发生在 通过
    company\u id
    用户id
    ,那么我只需要 用户id的
    结果

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

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

第三,听起来您误解了SQL,认为它可能会在一个查询中,例如您正在尝试制定(不使用
UNION ALL
)检索重复行,即多次检索同一行,因为它匹配多个条件。事实并非如此。

我正在寻找的“单一查询”解决方案似乎不存在,或者如果存在,它将比在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;
}
然后,我可以按照自己的意愿对该数组进行排序,并循环遍历该数组以响应所需的内容。 我不确定这是不是最好的方法,但它很有效,对我来说是闪电般的快

$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
警告:无法编制索引


语法修复:
groupby
orderby
reordered

select*…groupby
将在MySQL中工作。未分组行的返回行未定义,但通常是第一行found@knittl-你说得对,这将在MySQL中“起作用”。它甚至允许您通过指定一个不相关的
ORDER by
来强制最小值或最大值显示在一个列中。真是干净利落-/谢谢你的回复,很抱歉我的回复延迟了。以上几点你说得对。我会公布我最后做了什么。谢谢