使用SQL对表中的数据进行分类/分组

时间:2015-10-21 12:03:43

标签: php mysql sql

我已使用下载计数器将特定文件的物理位置存储在我的数据库中,以通过/Download/a4s等较短的网址提供下载。每个文件都有一个categoryId通过外键分配,它只描述它所属的课程/讲座,以便更容易地进行概述。表fileCategories基本上看起来像这样

categoryId | categoryName
---------------------------
         1 | Lecture 1
         2 | Lecture 2
         3 | Personal Stuff

假设我有一个files表,看起来像这样,其他一些列我省略了

fileId | categoryId | filePath     | ...
----------------------------------------
     1 |          1 | /Foo/Bar.pdf | ...
     2 |          1 | /Foo/Baz.pdf | ...
     3 |          2 | /Bar/Foo.pdf | ...
     4 |          2 | /Baz/Foo.pdf | ...
     5 |          3 | /Bar/Baz.pdf | ...

我创建了一个页面,该页面应显示有关这些文件的一些数据,并按类别对它们进行分组,这样就生成了一个非常简单的html表,如下所示:

Id | Path         | ...
-----------------------
Lecture 1
-----------------------
 1 | /Foo/Bar.pdf | ...
 2 | /Foo/Baz.pdf | ...
-----------------------
Lecture 2
-----------------------
 3 | /Bar/Foo.pdf | ...
 4 | /Baz/Foo.pdf | ...
-----------------------
Personal Stuff
-----------------------
 5 | /Bar/Baz.pdf | ...

到目前为止,我正在使用多个SQL查询来获取和存储PHP数组中的所有类别,并在迭代files表时将文件条目附加到这些数组。即使文件数量非常少,这也不太可能是最好的方法。我想知道是否有一个查询会自动将这些条目排序到临时表中(只是自发猜测使用它们),我可以输出这些查询以大大改善我目前获取数据的方式。

1 个答案:

答案 0 :(得分:3)

你不能只使用mysql,而是JOIN和一些PHP的组合。

SELECT * FROM files f LEFT JOIN fileCategories c USING (categoryId) ORDER BY c.categoryName ASC

请务必先按类别排序(名称或ID),然后按照其他参数排序,以允许以下代码示例按预期工作。

PHP中的

然后迭代结果,记住每行的类别id,如果它改变,你可以输出类别分隔符。确认查询结果存储在$dbRes

示例代码:

$lastCategoryId = null;
while ($row = $dbRes->fetchRow()) {
    if ($lastCategoryId !== $row['categoryId']) {
        echo "--------------------" . PHP_EOL;
        echo $row['categoryName'] . PHP_EOL
        echo "--------------------" . PHP_EOL;
    }

    echo $row['filePath'] . PHP_EOL;
    $lastCategoryId = $row['categoryId'];
}