纳马斯蒂!
我目前正在做我的一个项目,在这个项目中我有一个疑问。我要做的是:
我有4个表,名为:
1: project_degree
2: project_department
3: project_category
4: Projectsproject_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表结构如下:
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查询时,我希望列出与该特定项目相关的类别,我的代码如下所示:
$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
}
}最后,我运行嵌套循环和两个查询来获取类别名称。当涉及到大量数据时,我怀疑它会影响页面加载时间。对于这种情况,有没有更好的选择?
发布于 2013-08-06 17:09:53
这里应该是工作
$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
}但是规范化更好。
发布于 2013-08-06 17:15:38
最好添加一个新表project_has_catID,其中可以将project.id和cat.id存储为两列(project_id和cat_id)。删除项目表中的Cat_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");这样,您就有了一个类别名称列表。您不必使用多个数据库通信进行循环。
发布于 2013-08-06 17:21:23
您可以首先将所有类别名称加载到关联数组中,然后在循环遍历项目时在此数组中查找类别名称。
$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
}
}这样,您就不必更改数据库结构或代码结构。而且总共只需要执行两个查询,所以这是到目前为止最简单的解决方案。
不用说,正如其他人所指出的那样,规范化总是更好(永远不要使用包含多个逗号分隔值的列),但是您可能知道这一点,并且有理由以这种方式设置数据库表。
https://stackoverflow.com/questions/18075872
复制相似问题