我有一个简单的查询,我需要修改,但似乎无法弄清楚。
$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';
}