PHP MySQL Table join - 仅回显标识符一次,然后所有匹配项

PHP MySQL Table join - Echo identifier only once, then all matched items

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

$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 连接起来,但无法正常工作。 接下来我应该尝试什么??

谢谢。

试试这个:

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;
    }
}

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

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';  
}

您需要将查询更改为:

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() 函数的文档以查看其选项;默认情况下,它使用逗号 (',') 来连接值,也许您希望在逗号后添加 space。您还可以控制连接值的顺序。