mysql_fetch_assoc问题

时间:2011-08-01 20:13:29

标签: php mysql

我在使用mysql_fetch_assoc脚本时遇到了一些麻烦,希望你能帮忙。

背景: 我正在使用典型的MySQL查询检索我的部分网站的数据,并从我的主表中回显各种字段等的结果,其结构不重要但具有唯一ID,即'job_id'

为了让多个类别与'job_id'相关联,我使用了一个toxi解决方案,将catgories与每个'job_id'相关联。

TABLE `tags` (
`tag_id` INT NOT NULL AUTO_INCREMENT, 
`tag_name` VARCHAR(20) NOT NULL, 
PRIMARY KEY (`tag_id`)
)

CREATE TABLE `tag_relational` (
`job_id` INT NOT NULL, 
`tag_id` INT NOT NULL
)

当我从主表中回显信息时(使用'job_id')我还想回显所有与job_id匹配的类别,使用以下ID:

$query = "SELECT * FROM tags t
JOIN tag_relational r   
ON t.tag_id=r.tag_id
WHERE r.job_id = $job_id";

$result=mysql_query($query) or die(mysql_error());
$cats=mysql_fetch_assoc($result);

在我的代码中,我使用它来回应匹配的类别:

<p>Job Catagories | <?php while ($cats=mysql_fetch_assoc($result)) { echo $cats['tag_name'];}?></p>

我有两个问题:

  1. 上面的回声似乎忽略了第一个标记名称,所以如果一个作业被标记为六个类别,它只会回显五个。如果一份工作只标有一份工作,我什么也得不到。查询在SQL shell中工作,所以我假设问题在于PHP。
  2. 当我获得多个回声时,我希望能够用逗号或|来分隔它们,但我不熟悉在查询中使用group_concat,所以我也可以在那里使用一些帮助。

2 个答案:

答案 0 :(得分:3)

因为在while循环之前已经调用了一次mysql_fetch_assoc,所以总是丢弃第一行。

这可以解决你的问题:

$query = "SELECT * FROM tags t
JOIN tag_relational r   
ON t.tag_id=r.tag_id
WHERE r.job_id = $job_id";

$result=mysql_query($query) or die(mysql_error());

<p>Job Catagories | 
<?php 
$first = true;
while ($cats=mysql_fetch_assoc($result)) { 
    if($first){
        $first = false;
    } else{
        echo ", ";
    }
    echo $cats['tag_name'];
}
?>
</p>

答案 1 :(得分:0)

在group_concat中使用SEPARATOR。见下面的例子

mysql> SELECT student_name,  
        ->     GROUP_CONCAT(DISTINCT test_score
        ->               ORDER BY test_score DESC SEPARATOR ' ')
        ->     FROM student
        ->     GROUP BY student_name;