PHP MySQL 表连接 - 回显标识符仅一次,然后所有匹配的项目


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连接为某种东西,但无法使其工作。接下来我应该尝试什么?

谢谢。

您需要将查询更改为:

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

试试这个:

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