【问题标题】:missing column data when retrieving rows from a JOIN query从 JOIN 查询中检索行时缺少列数据
【发布时间】:2015-02-01 18:14:24
【问题描述】:

在 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'];?>   
}

现在我怎样才能让每个表格标题成为一个字段名称。

【问题讨论】:

    标签: php mysql join


    【解决方案1】:

    您可以通过在字段后添加AS &lt;alias&gt; 为字段指定别名。

    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'] 获取部门名称。

    我认为'title'是一个相当奇怪的术语,用于部门或课程的名称,但如果它们都被命名为'name',你会再次遇到同样的问题。 :D

    顺便说一句,您可以使用命名约定来减少这样的冲突。就像您拥有department_id(而不仅仅是id)一样,您也可以使用department_name 或只是department。尽管如此,了解别名还是很好的,因为您迟早会需要它们。

    【讨论】:

    • 谢谢 Golez Trol,但问题是现在我无法更改数据库。 php 中的任何解决方案。
    • 不用担心。在数据库中更改它只是一个建议。您可以在查询中使用别名,而无需更改实际数据库。
    【解决方案2】:

    当您在 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 */
    }
    

    【讨论】:

    • 谢谢,但我无法更改表格中的字段名称。所以请在php中提供任何帮助...
    猜你喜欢
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2014-05-21
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 2020-04-03
    相关资源
    最近更新 更多