在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'];?>
}
现在,我如何才能将每个表标题作为字段名称。
答案 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_name
或department
。不过,知道别名是很好的,因为你迟早会需要它们。
答案 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 */
}