PHP MySQL表连接 - 只有一次Echo标识符,然后是所有匹配的项目

时间:2015-01-30 21:07:09

标签: php mysql left-join

我有一个简单的查询,我需要修改但似乎无法弄清楚。

$query = "SELECT cust.first,pets.pet_name FROM `cust` 
    LEFT JOIN pets ON cust.id=pets.client_id 
    WHERE `clinic`='20'";
    $result = $conn->query($query) or die($conn->error.__LINE__);

    if($result->num_rows > 0) {
        while($row = $result->fetch_assoc()) {
            $firstname=stripslashes($row['first']); 
            $pet=stripslashes($row['pet_name']);    
            echo $firstname." - ".$pet."<br/>";
        }
    }
    else {
        echo 'NO RESULTS';  
    }

此代码生成:

Name1 - Pet 1
Name1 - Pet 2
Name2 - Pet 1
Name2 - Pet 2
Name3 - Pet 1
Name4 - Pet 1

我需要的是:

Name1 - Pet 1, Pet 2
Name2 - Pet 1, Pet 2
Name3 - Pet 1
Name4 - Pet 1

但我无法找到如何完成这项工作。 我理解为什么它现在做错了。

我试图将pets.pet_name作为一些东西连接起来,但是不能让它工作。 接下来应该尝试什么?

谢谢。

3 个答案:

答案 0 :(得分:1)

试试这个:

if($result->num_rows > 0) {
    $curName = '';
    while($row = $result->fetch_assoc()) {
        $firstname=stripslashes($row['first']); 
        $pet=stripslashes($row['pet_name']);    
        if ($firstname == $curName) {
          echo ",".$pet;
        } elseif ($curName!='') {
          echo "<br/>".$firstname." - ".$pet;
        } else {
          echo $firstname." - ".$pet;
        }
        $curName = $firstname;
    }
}

答案 1 :(得分:1)

您需要将查询更改为:

SELECT cust.first, GROUP_CONCAT(pets.pet_name) AS pet_names
FROM cust 
   LEFT JOIN pets ON cust.id=pets.client_id 
WHERE clinic = '20'
GROUP BY cust.id

它产生你想要的结果集;没有必要更改PHP代码。

查看GROUP_CONCAT()功能的文档以查看其选项;默认情况下,它使用逗号(',')来连接值,也许您希望在逗号后面有空格。您还可以控制连接值的顺序。

答案 2 :(得分:0)

你应该像这样构建一个数组:

array('data') {
    string ['cust_id'] => 
        ['firstname']=>string('Name1')
        array('pets') {
            [0]=> string('pet1')
            [1]=> string('pet2')
            [2]=> string('pet3')
             .
             .
             .
        }
}

这样,您拥有属于客户的所有宠物,id_customer是关键。为此,您应该获取所有数据以构建它,然后再次获取它以进行打印。

以下是没有测试的示例:

$query = "SELECT cust.id, cust.first,pets.pet_name FROM `cust` 
    LEFT JOIN pets ON cust.id=pets.client_id 
    WHERE `clinic`='20'";
$result = $conn->query($query) or die($conn->error.__LINE__);

$data = array();
if($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
        $firstname=stripslashes($row['first']); 
        $pet=stripslashes($row['pet_name']);    
        echo $firstname." - ".$pet."<br/>";

        if(!isset($data[$row['cust.id']]['firstname']))
            $data[$row['cust.id']]['firstname'] = $firstname;
        $data[$row['cust.id']]['pets'][] = $pet;

    }
    foreach ($data as $item) {
        $str = '';
        $str .= $item['firstname'];
        $num_pets = count($item['pets']);
        for($i=0;$i<$num_pets;$i++) {
            $str.= " - Pet " . $item['pets'][$i];
            if($i<($num_pets-1)) $str.=",";
        }
        echo $str ."<br/>";
    }
}
else {
    echo 'NO RESULTS';  
}