繁体   English   中英

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

[英]Categorize/Group data from table using SQL

我已经使用下载计数器将特定文件的物理位置存储在数据库中,以通过较短的网址(例如/Download/a4s 每个文件都有一个通过外键分配的categoryId ,该ID仅描述文件所属的课程/课程,以便于浏览。 表文件的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表时将文件条目追加到这些数组中。 即使文件数量很少,这也不是最好的方法。 我想知道是否存在一个查询,该查询将自动将这些条目分类到临时表中(只是使用这些表的自发猜测),可以将其输出以大大改善当前获取数据的方式。

您不能仅使用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'];
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM