我有以下查询。
$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_id
和dept_id
而不是company_id
。
例如:
purchase_id
通过dept_id
获得的行
user_id
,那我只想要结果
对于user_id
; purchase_id
通过company_id
获得的行
和user_id
,那我只想要
user_id
答案 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 BY
和ORDER BY
重新排序