我正在使用Laravel的Eloquent ORM来查询数据库以获取信息,但由于某种原因,结果查询没有返回所有行。
雄辩查询:
\Permit::selectRaw('CONCAT(lk_departments.dept_id, ".") AS dept_id, '.
'lk_departments.dept_name, '.
'COUNT(DISTINCT permits.permit_number) AS total')
->leftJoin('lk_departments', 'permits.dept_id', '=', 'lk_departments.dept_id')
->where('permits.permit_number', '!=', 'N/A')
->whereBetween('permits.valid_date', [$query_info['start_date'], $query_info['end_date']])
->groupBy('lk_departments.dept_name')
->orderBy('lk_departments.dept_name', 'ASC')
->get()
结果查询:
SELECT
CONCAT(lk_departments.dept_id, ".") AS dept_id, lk_departments.dept_name,
COUNT(DISTINCT permits.permit_number) AS total
FROM permits
LEFT JOIN lk_departments ON permits.dept_id = lk_departments.dept_id
WHERE permits.valid_date BETWEEN '01/01/2000' AND '12/12/2100'
GROUP BY lk_departments.dept_name
ORDER BY lk_departments.dept_name ASC
退回数据:
dept_id dept_name total
+--------------------------------------------------------+
| NULL NULL 0 |
| 1. Academic Achievement-(Special Services) 11 |
| 3. Academic Clubs 1 |
| 4. Academic Custodial & Grounds Services 1 |
| 5. Accounting 2 |
| 6. Admissions 356 |
| 7. Advanced Programs Dept (Education Dept) 8 |
| 9. Aerospace Studies - Air Force ROTC 1 |
| 11. American Federation of Teachers 0 |
| 13. Anthropology 1 |
| 14. Art Dept. 4 |
| 17. Athletic Dept. 11 |
| 21. Biology Dept. 2 |
| |
| ... ... ... |
+--------------------------------------------------------+
我引用了这个问题来修改total
:Count distinct values
但我仍然会收到一个NULL
行total
0
且缺少记录。我对MySQL不是很了解,所以如果我错过了什么,请原谅我。理想情况下,我想在给定的时间范围内计算每个部门的许可证数量。
注意:
dept_id
=自动递增的主键
permits
=包含链接到部门的停车许可信息的表
答案 0 :(得分:1)
我终于找到了问题所在。当我在联接中使用permits
作为主表时,我忽略了dept_id
的记录如果没有来自permits.dept_id
的相应记录则不会显示匹配lk_departments.dept_id
(换句话说,如果没有人为该部门注册了许可证)。此外,出于某种原因,我不得不更改查询以包含permits.permit_number is null
。
产生的雄辩查询:
LKDepartment::selectRaw('lk_departments.*, COUNT(permits.permit_number) AS total')
->leftJoin('permits', 'lk_departments.dept_id', '=', 'permits.dept_id')
->whereNull('permits.permit_number')
->orWhereRaw("(permits.permit_number != 'N/A' AND permits.valid_date BETWEEN '$query_info[start_date]' AND '$query_info[end_date]')")
->groupBy('lk_departments.dept_id')
->orderBy('lk_departments.dept_id', 'ASC')
->get()
结果查询:
SELECT lk_departments.* , COUNT( permits.permit_number ) AS total
FROM lk_departments
LEFT JOIN permits ON lk_departments.dept_id = permits.dept_id
WHERE permits.permit_number IS NULL
OR (
permits.permit_number != 'N/A'
AND permits.valid_date BETWEEN '01/01/2000' AND '12/12/2100'
)
GROUP BY lk_departments.dept_id
ORDER BY lk_departments.dept_id ASC
退回数据:
dept_id dept_name total
+--------------------------------------------------------+
| NULL NULL 0 |
| 1 Academic Achievement-(Special Services) 11 |
| 2 Academic Advising Center 0 |
| 3 Academic Clubs 1 |
| 4 Academic Custodial & Grounds Services 1 |
| 5 Accounting 2 |
| 6 Admissions 356 |
| 7 Advanced Programs Dept (Education Dept) 8 |
| 8 Advisory Council 0 |
| 9 Aerospace Studies - Air Force ROTC 1 |
| 10 Alternative School 0 |
| 11 American Federation of Teachers 0 |
| 12 Anthropology 0 |
| |
| ... ... ... |
+--------------------------------------------------------+
答案 1 :(得分:0)
我想使用一个orm你不能做一个案子。您应该以编程方式解决问题,如果您使用的是orm,则更好的做法是,将数据库映射到对象而不处理结果