Php 使用SQL对表中的数据进行分类/分组
我已将特定文件的物理位置存储在数据库中,并使用下载计数器通过较短的URL(如Php 使用SQL对表中的数据进行分类/分组,php,mysql,sql,Php,Mysql,Sql,我已将特定文件的物理位置存储在数据库中,并使用下载计数器通过较短的URL(如/download/a4s)提供下载。每个文件都有一个通过外键分配的categoryId,外键只描述了它所属的课程/讲座,以便于概览。表fileCategories基本上如下所示 categoryId | categoryName --------------------------- 1 | Lecture 1 2 | Lecture 2 3 | Personal
/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数组中的所有类别,并在遍历
文件
表时将文件条目附加到这些数组中。即使文件数量非常少,这也不太可能是最好的方法。我想知道是否有一个查询会自动将这些条目排序到临时表中(只是一个使用这些条目的自发猜测),我可以输出这些临时表,从而大大改进我当前获取数据的方式。仅使用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'];
}
您不能仅使用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'];
}
您不能仅使用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'];
}
您不能仅使用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'];
}
您应该了解
加入。然后,您必须在php中进行一些额外的处理,以获得所需的输出。@GordonLinoff实际上我知道如何连接表,但我很好奇在我的例子中,可以在多大程度上将处理从php移动到SQL。您应该了解JOIN
。然后,您必须在php中进行一些额外的处理,以获得所需的输出。@GordonLinoff实际上我知道如何连接表,但我很好奇在我的例子中,可以在多大程度上将处理从php移动到SQL。您应该了解JOIN
。然后,您必须在php中进行一些额外的处理,以获得所需的输出。@GordonLinoff实际上我知道如何连接表,但我很好奇在我的例子中,可以在多大程度上将处理从php移动到SQL。您应该了解JOIN
。那么,您必须在php中进行一些额外的处理才能获得所需的输出。@GordonLinoff实际上我知道如何连接表,但我很好奇在我的例子中,可以在多大程度上将处理从php移动到SQL。您的查询似乎无效-而不是使用categoryId
在c上应该是。categoryId=f、 categoryId
我猜?如果要联接的两个表中的字段名相同,使用fieldname
相当于表1上的。fieldname=table2。fieldname
您的查询似乎无效-我猜应该是而不是使用categoryId
在c.categoryId=f.categoryId
上?如果要联接的两个表中的字段名相同,使用fieldname
相当于表1上的。fieldname=table2。fieldname
您的查询似乎无效-我猜应该是而不是使用categoryId
在c.categoryId=f.categoryId
上?如果要联接的两个表中的字段名相同,使用fieldname
相当于表1上的。fieldname=table2。fieldname
您的查询似乎无效-我猜应该是而不是使用categoryId
在c.categoryId=f.categoryId
上?如果要联接的两个表中的字段名相同,使用fieldname
相当于表1中的。fieldname=table2。fieldname