首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将类别存储为逗号分隔数组并在循环中提取每个类别对性能有何影响?

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

Stack Overflow用户
提问于 2013-08-06 17:03:58
回答 3查看 149关注 0票数 1

纳马斯蒂!

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

我有4个表,名为:

代码语言:javascript
复制
1: project_degree
2: project_department
3: project_category
4: Projects

project_degree有四个顶级学位: B.tech、M.tech、M.C.A.和M.B.A.。

project_department有自己的部门,如: C.S.E、I.T.、E.等。

现在,project_category有一些类别,如PHP,.NET,SAP等。

我要做的是,将一个名为"projects“的项目添加到数据库中,并将其分配给学位、部门和类别。

projects表结构如下:

代码语言:javascript
复制
id    |    project name    |    degree_id    |    Dept_id    |    Cat_id

1     |   Sample project   |        1        |       3       |   4,3,6,5,9

现在,正如您在上面看到的,字段"cat_id“有多个类别,每个类别ID都用逗号分隔。

现在,当我从名为" projects“的表中调用get all projects查询时,我希望列出与该特定项目相关的类别,我的代码如下所示:

代码语言:javascript
复制
$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
    }
}

最后,我运行嵌套循环和两个查询来获取类别名称。当涉及到大量数据时,我怀疑它会影响页面加载时间。对于这种情况,有没有更好的选择?

EN

回答 3

Stack Overflow用户

发布于 2013-08-06 17:09:53

这里应该是工作

代码语言:javascript
复制
$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
}

但是规范化更好。

票数 0
EN

Stack Overflow用户

发布于 2013-08-06 17:15:38

最好添加一个新表project_has_catID,其中可以将project.id和cat.id存储为两列(project_id和cat_id)。删除项目表中的Cat_id列。完成后,只需通过下一个查询选择名称即可;

代码语言:javascript
复制
$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");

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

票数 0
EN

Stack Overflow用户

发布于 2013-08-06 17:21:23

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

代码语言:javascript
复制
$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
    }
}

这样,您就不必更改数据库结构或代码结构。而且总共只需要执行两个查询,所以这是到目前为止最简单的解决方案。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18075872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档