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