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。您还可以控制连接值的顺序。
我有一个简单的查询需要修改,但似乎无法理解。
$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。您还可以控制连接值的顺序。