Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.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 将类别存储为逗号分隔的数组并在循环中提取每个类别对性能有何影响?_Php_Mysql - Fatal编程技术网

Php 将类别存储为逗号分隔的数组并在循环中提取每个类别对性能有何影响?

Php 将类别存储为逗号分隔的数组并在循环中提取每个类别对性能有何影响?,php,mysql,Php,Mysql,纳马斯蒂 我目前正在做我的一个项目,我有一个疑问。 我正在做的是: 我有4张桌子,叫做: 1: project_degree 2: project_department 3: project_category 4: Projects project_学位有四个顶级学位,分别是:理工学士、理工硕士、工商管理硕士和工商管理硕士 项目部有各自的部门,如:C.S.E、I.T、E.E.E.等 现在,project_类别有一些类别,如PHP、.NET、SAP等 我想做的是,我在数据库中添加一个名为“pro

纳马斯蒂

我目前正在做我的一个项目,我有一个疑问。 我正在做的是:

我有4张桌子,叫做:

1: project_degree
2: project_department
3: project_category
4: Projects
project_学位有四个顶级学位,分别是:理工学士、理工硕士、工商管理硕士和工商管理硕士

项目部有各自的部门,如:C.S.E、I.T、E.E.E.等

现在,project_类别有一些类别,如PHP、.NET、SAP等

我想做的是,我在数据库中添加一个名为“projects”的项目,并将其分配给学位、系和类别

项目表结构如下:

id    |    project name    |    degree_id    |    Dept_id    |    Cat_id

1     |   Sample project   |        1        |       3       |   4,3,6,5,9
正如您在上面所看到的,字段“cat_id”有多个类别,其中每个类别id用逗号分隔

现在,当我调用从名为“projects”的表中获取所有项目的查询时,我想列出与该特定项目相关的类别,我的代码如下所示:

$query = mysql_query("SELECT * from projects ORDER BY id DESC");
while($row = mysql_fetch_array($query)) {
    $categories = $row['cat_id'];
    $cat_arr    = explode(',',$categories);
    $cat_size   = sizeof($cat_arr);

    for($i=0;$i<$cat_size;$i++) {
        $get_cat = mysql_query("SELECT * from project_category WHERE id='".$cat_arr['$i']."'");
        $cat_row = mysql_fetch_array($get_cat);
        echo $cat_row['name']; // Here finally I'm getting categories name
    }
}
$query=mysql\u query(“按id描述从项目订单中选择*);
while($row=mysql\u fetch\u array($query)){
$categories=$row['cat_id'];
$cat_arr=爆炸(“,”,$categories);
$cat_size=sizeof($cat_arr);
对于($i=0;$i这里应该是工作

$query = mysql_query("SELECT * from projects ORDER BY id DESC");
while($row = mysql_fetch_array($query)) {
    $get_cat = mysql_query("SELECT * from project_category WHERE id IN (" . $row['cat_id'] . ")");
    $cat_row = mysql_fetch_array($get_cat);
    echo $cat_row['name']; // Here finally I'm getting categories name
}

但是规范化更好。

最好添加一个新表,project\u有\u catID,可以将project.id和cat.id存储为两列(project\u id和cat\u id)。删除project表中的cat\u id列。 完成后,只需通过下一个查询选择名称

$query = mysql_query("SELECT project_category.name from project_category INNER JOIN project_has_catID phc ON phc.cat_id = project_category.id ORDER BY phc.project_id DESC");

这样,您就有了一个类别名称列表。您不必使用多个数据库通信进行循环。

您可以先将所有类别名称加载到关联数组中,然后在项目循环时在此数组中查找类别名称

$categoryNames = array();
$query = mysql_query("SELECT id, name FROM project_category");
while ($row = mysql_fetch_array($query))
{
    $categoryNames[$row['id']] = $row['name'];
}
$query = mysql_query("SELECT * FROM projects ORDER BY id DESC");
while ($row = mysql_fetch_array($query))
{
    $categoryIds = explode(',', $row['cat_id']);
    foreach ($categoryIds as $cat_id)
    {
        $cat_name = $categoryNames[$cat_id];
        //do what you want with the name here
    }
}
这样,您就不必更改数据库结构或代码结构,而且总共只需执行两个查询,因此这是迄今为止最简单的解决方案


不用说,正如其他人指出的那样,规范化总是更好的(不要使用包含多个逗号分隔值的列),但您可能知道并有理由这样设置数据库表。

性能是一个问题,但更重要的问题是一个健全、易于查询的数据结构。规范化您的数据库!谷歌“数据库规范化”。规范化数据库将提高性能,因为您可以在SQL中使用JOIN语句;而从MySQL切换到MySQLi或PDO,以便您可以使用准备好的语句和绑定变量,这将允许您提高安全性-我希望任何有学位课程数据的站点都能做到这两个方面,并练习它们应该做的事情achingI认为提高性能的最简单方法是在类别和项目之间创建一个链接表,即规范化。不过,您可以参考这个问题了解一些选项。带有多个select查询的嵌套循环并不是一个好的解决方案:规范化、使用联接和单个select是一个更好的选择r完全是错误的。在while循环中,您执行一个返回多个类别的查询,并且只获取(可能)第一个类别的名称。您是对的。但这确实需要更改数据库结构。请参阅我的答案-它不需要这些更改。