从JOIN查询中检索行时缺少列数据

时间:2015-02-01 18:14:25

标签: php mysql join

在php和mysql中,我在几个表上使用连接查询。每个表都有字段名title。我想从每个JOINed表中获取title的值,但是当我使用php检索结果集的每一行时,我只得到title的最后一个值,这是我的查询。

SELECT UC.user_id, 
       UC.courses_id, 
       UC.semester_id, 
       UC.batch_id, 
       UC.department_id, 
       U.title,
       U.firstname,
       U.lastname,
       B.title , 
       CO.title, 
       SE.title, 
       DEP.title
  FROM tbl_user_courses AS UC
 INNER JOIN tbl_user AS U ON UC.user_id = U.id
 INNER JOIN tbl_batch AS B ON UC.user_id = B.id
 INNER JOIN tbl_courses AS CO ON UC.user_id = CO.id
 INNER JOIN tbl_semester AS SE ON UC.user_id = SE.id
 INNER JOIN tbl_departments AS DEP ON UC.user_id = DEP.id
 where UC.trash=0 
 order by UC.user_id desc

它的PHP代码

<?php
  if($rec)
    foreach( $rec as $value => $k){
?>


<?php echo $k['title']; 
<?php echo $k['title'];?>

<?php echo $k['title'];?>   
<?php echo $k['title'];?>   
}

现在,我如何才能将每个表标题作为字段名称。

2 个答案:

答案 0 :(得分:1)

您可以在字段后面添加AS <alias>,为字段添加别名。

SELECT UC.user_id, 
       UC.courses_id, 
       UC.semester_id, 
       UC.batch_id, 
       UC.department_id, 
       U.title as user_title,
       U.firstname,
       U.lastname,
       B.title AS batch_title, 
       CO.title AS course_title, 
       SE.title AS semester_title, 
       DEP.title AS department_title
  FROM tbl_user_courses AS UC
 INNER JOIN tbl_user AS U ON UC.user_id = U.id
 INNER JOIN tbl_batch AS B ON UC.user_id = B.id
 INNER JOIN tbl_courses AS CO ON UC.user_id = CO.id
 INNER JOIN tbl_semester AS SE ON UC.user_id = SE.id
 INNER JOIN tbl_departments AS DEP ON UC.user_id = DEP.id
 where UC.trash=0 
 order by UC.user_id desc

如果您运行此查询,则可以使用别名而不是字段名称,因此请使用$k['department_title']获取部门的名称。

我认为“标题”是用于部门或课程名称的相当奇怪的术语,但如果它们都被命名为“名称”,那么您将再次遇到相同的问题。 :d

顺便说一下,您可以使用命名约定来减少这样的冲突。就像您拥有department_id(而不只是id)一样,您也可以使用department_namedepartment。不过,知道别名是很好的,因为你迟早会需要它们。

答案 1 :(得分:1)

当您在PHP中使用fetch_assoc()函数从结果集中检索行时,如果您的某些列具有相同的名称,则会丢失数据。如您所知,您拥有一大堆名为title的列。

你想要这样的东西,把别名放在你的一些结果集列上,这样它们就不会都有相同的名字。

这些别名不会更改表中列的名称。它们仅更改查询结果中列的名称。当你说

 SELECT title AS user_title

从表中获取名为title的列,但在结果集中为其指定名称user_title

试试这个:

SELECT UC.user_id, UC.courses_id, UC.semester_id, UC.batch_id, UC.department_id, 
       U.title AS user_title, 
       U.firstname, U.lastname,
       B.title AS batch_title, 
       CO.title AS course_title, 
       SE.title AS semester_title, 
       DEP.title AS department_title
     ...

然后,在php中,使用这样的代码......

<?php echo $k['user_title']; 
<?php echo $k['batch_title'];?>
<?php echo $k['course_title'];?>
<?php echo $k['semester_title'];?>   
<?php echo $k['department_title'];?>   

或者,如果您正在使用PDO,则可以将结果集的每一行提取到编号而非关联数组中。

$sth = $dbh->prepare("/*YOUR ORIGINAL QUERY8?")  || die "prepare failed";
$sth->execute() || die "execute failed";

while ( $k = $sth->fetch( PDO::FETCH_NUM ) ) {
    <?php echo 'batch title: ';echo $k[8];?>
    <?php echo 'course title: ';echo $k[9];?>
    /* etcetera */
}

这是有效的,因为它将结果集中每行的列提取到数字索引数组(0 .. n)而不是关联数组。

您也可以在过时的mysql API中使用

获得相同的效果
while ($k = mysql_fetch_array($resultset, MYSQL_NUM) ) {
   /* handle the row */
}