使用distinct和group的PHP/MySql报告?

使用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

我正在尝试为一个MySql表编写一个PHP报告,但是我有点被应该查看的正确命令卡住了

表格结构如下:

|  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