Php 如何在一个MySQL Select查询中做到这一点,我想丢失foreach循环和第二个Select查询?
下面的代码给出了我想要的结果,但它涉及2个数据库查询。我更愿意通过一个数据库查询来更高效地完成这项工作。是否有一种方法可以构造SELECT语句,通过一个数据库查询获得下面所需的结果 DB表:费率 费率结构:id、季节id、propID、费率Php 如何在一个MySQL Select查询中做到这一点,我想丢失foreach循环和第二个Select查询?,php,mysql,Php,Mysql,下面的代码给出了我想要的结果,但它涉及2个数据库查询。我更愿意通过一个数据库查询来更高效地完成这项工作。是否有一种方法可以构造SELECT语句,通过一个数据库查询获得下面所需的结果 DB表:费率 费率结构:id、季节id、propID、费率 try { $conn = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass); $conn->setAttribute(PDO::ATTR_ERRMODE, PD
try {
$conn = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$conn->exec("SET CHARACTER SET utf8");
$sql = "SELECT DISTINCT(seasonID), season.seasonDesc FROM `rates`
INNER JOIN season
ON rates.seasonID = season.id
WHERE propID = :propID";
$sqlprep = $conn->prepare($sql);
$ar_val = array(':propID'=>$propID);
if($sqlprep->execute($ar_val)) {
while($row = $sqlprep->fetch(PDO::FETCH_OBJ)){
$seasonID[$row->seasonDesc] = $row->seasonID;
//print_r($seasonID);
}
}
} catch(PDOException $e) {
echo $e->getMessage();
}
foreach($seasonID AS $key => $value){
echo "<b>".$key."</b>";
echo "<ul>";
try {
$conn = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
$conn->exec("SET CHARACTER SET utf8");
$sql = "SELECT * FROM `rates`
WHERE seasonID = :seasonID
AND propID = 1
ORDER BY AccomType,rateType";
$sqlprep = $conn->prepare($sql);
$ar_val = array(':seasonID'=>$value);
if($sqlprep->execute($ar_val)) {
while($row = $sqlprep->fetch(PDO::FETCH_OBJ)){
echo "<li>".$row->accomType."<br>";
echo " ".$row->rateType." - ";
echo " R".number_format($row->rate,'2','.',' ')." ".$row->rateUnit."</li>";
}
}
}
catch(PDOException $e) {
echo $e->getMessage();
}
echo "</ul>";
}
所需结果(foreach循环给我这个结果):
Season 1 Property 1 rate: 1
Season 1 Property 2: rate 1
Season 1 Property 3: rate 1
Season 2 Property 1 rate: 1
Season 2 Property 2: rate 1
Season 2 Property 3: rate 1
Season 3 Property 1 rate: 1
Season 3 Property 2: rate 1
Season 3 Property 3: rate 1
Season 1
Property 1 rate: 1
Property 2: rate 1
Property 3: rate 1
Season 2
Property 1 rate: 1
Property 2: rate 1
Property 3: rate 1
Season 3
Property 1 rate: 1
Property 2: rate 1
Property 3: rate 1
首先:不要在循环中询问调用查询-这是非常无效的。只需一次查询,即可轻松下载所有数据:
$sql = "SELECT rates.*, season. seasonDesc FROM `rates`
JOIN seasons ON rates.seasonID = season.id
WHERE -- insert here proper where case
ORDER BY AccomType,rateType"
现在,在循环遍历结果时,只需要一个小技巧:
$activeSeasonId = null;
while($row = $sqlprep->fetch(PDO::FETCH_OBJ)){
if($activeSeasonId != $row->seasonID) {
if(activeSeasonId != null) {
//close previous <ul> here
}
// open new <ul> here
$activeSeasonId = $row->seasonID;
}
// print your <li> here
}
//after everything close last <ul>
$activeSeasonId=null;
while($row=$sqlprep->fetch(PDO::fetch_OBJ)){
如果($activeSeasonId!=$row->seasonID){
如果(activeSeasonId!=null){
//在此处关闭上一个
}
//在此处打开新
$activeSeasonId=$row->seasonID;
}
//在这里打印您的-
}
//最后一次关闭后
诀窍是保存实际的季节ID,并在其更改时进行检查。然后你要做的就是打印新的seasonDesc并继续循环。你的代码在哪里?我不能进行连接,因为这都是从一个表
季节。seasonDesc
是从另一个表来的,对吗?对不起,你是对的,忽略我的评论。我明白你说的很好,很简单,现在就试试。好的,它很好,有一个问题:我一开始就挂了。