使用distinct和group的PHP/MySql报告?
我正在尝试为一个MySql表编写一个PHP报告,但是我有点被应该查看的正确命令卡住了 表格结构如下:使用distinct和group的PHP/MySql报告?,php,mysql,Php,Mysql,我正在尝试为一个MySql表编写一个PHP报告,但是我有点被应该查看的正确命令卡住了 表格结构如下: | Int | employeeID | lessonID | date | 1 | 15110 | 50 | 2010-10-18 | 2 | 15110 | 51 | 2010-10-18 | 3 | 15110 | 52 | 2010-10-18
| Int | employeeID | lessonID | date
| 1 | 15110 | 50 | 2010-10-18
| 2 | 15110 | 51 | 2010-10-18
| 3 | 15110 | 52 | 2010-10-18
| 4 | 15110 | 50 | 2010-10-18
| 5 | 13211 | 51 | 2010-10-18
| 6 | 13211 | 52 | 2010-10-18
| 7 | 11542 | 60 | 2010-10-18
因此,每次打开一个课程时,都会添加一个带有employeeID和lessonID的新行
我试图创建的报告将显示访问过Lessonid50、51和52的人
例如,报告的外观如下所示:
| employeeID | lessonID 50 | lessonID 51 | lessonID 52 |
15110 Y Y Y
13211 N Y Y
到目前为止,我对SQL查询的了解是:
SELECT DISTINCT employeeID, lessonID
FROM elearning.el_lessonmetrics
WHERE lessonID = 50 OR lessonID = 51 OR lessonID = 52;
其中:
| employeeID | lessonID |
15110 50
15110 51
15110 52
13211 50
13211 51
有谁能帮助我将这些结果形成上面的报告结构
谢谢你要找的是一个 互联网上有几个MySQL教程:
SELECT a.employeeID,
CASE WHEN j1.lessonID IS NULL THEN 'N' ELSE 'Y' END AS `lessionID50`,
CASE WHEN j2.lessonID IS NULL THEN 'N' ELSE 'Y' END AS `lessionID51`,
CASE WHEN j3.lessonID IS NULL THEN 'N' ELSE 'Y' END AS `lessionID52`
FROM elearning.el_lessonmetrics AS a
LEFT JOIN elearning.el_lessonmetrics AS j1 ON a.employeeID = j1.employeeID
LEFT JOIN elearning.el_lessonmetrics AS j2 ON a.employeeID = j2.employeeID
LEFT JOIN elearning.el_lessonmetrics AS j3 ON a.employeeID = j3.employeeID
WHERE (j1.lessonID = 50 OR j1.lessonID IS NULL)
AND (j2.lessonID = 51 OR j2.lessonID IS NULL)
AND (j3.lessonID = 52 OR j3.lessonID IS NULL)
GROUP BY a.employeeID
如果您不知道课程的数量,或者课程的数量很多,那么这种方法就不能很好地工作(您最好在PHP中对结果进行后处理以构建表)
例如:
SELECT DISTINCT employeeID, lessonID
FROM elearning.el_lessonmetrics
WHERE lessonID IN (50, 51, 52);
然后,在PHP中
$employees = array();
$lessons = array();
while ($row = getRowFromDatabase()) {
$lessons[$row['lessonID']] = true;
$employees[$row['employeeID']][$row['lessonID']] = true;
}
foreach ($employees as &$employee) {
foreach ($lessons as $lessonId => $status) {
if (!isset($employee[$lessonId])) {
$employee[$lessonId] = false;
}
}
}
这将产生如下数组:
array (
15110 => array(
50 => true,
51 => true,
52 => true,
),
13211 => array(
50 => true,
51 => true,
52 => false,
),
)
感谢您的帮助,我只是想知道您是否可以澄清在foreach循环中使用&before$employeeID?我可以看到,当回显结果时,如果您将其保留在lessonID键中,即使用户没有上过课,该键仍然存在,但是如果您将其取出,则如果用户没有上过课,该键将消失。最后一个问题:)如果我有另一个通过employeeID链接到EmployeeName的表,那么在遍历数组时最好生成一个单独的查找,还是可以扩展第一个sql语句来获取该数据?基本上,它会创建一个。它允许您直接更改变量(这是一个快捷方式,如果您愿意,您可以不使用引用进行更改)。您可以更改查询以获取名称。只需将第一个联接(表别名a)修改为引用的表…谢谢,我已经成功地联接了这些表并获得了我想要的结果,现在开始阅读多维数组:p