Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用SQL对表中的数据进行分类/分组_Php_Mysql_Sql - Fatal编程技术网

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

Php 使用SQL对表中的数据进行分类/分组,php,mysql,sql,Php,Mysql,Sql,我已将特定文件的物理位置存储在数据库中,并使用下载计数器通过较短的URL(如/download/a4s)提供下载。每个文件都有一个通过外键分配的categoryId,外键只描述了它所属的课程/讲座,以便于概览。表fileCategories基本上如下所示 categoryId | categoryName --------------------------- 1 | Lecture 1 2 | Lecture 2 3 | Personal

我已将特定文件的物理位置存储在数据库中,并使用下载计数器通过较短的URL(如
/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