Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在一个MySQL Select查询中做到这一点,我想丢失foreach循环和第二个Select查询?_Php_Mysql - Fatal编程技术网

Php 如何在一个MySQL Select查询中做到这一点,我想丢失foreach循环和第二个Select查询?

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

下面的代码给出了我想要的结果,但它涉及2个数据库查询。我更愿意通过一个数据库查询来更高效地完成这项工作。是否有一种方法可以构造SELECT语句,通过一个数据库查询获得下面所需的结果

DB表:费率

费率结构:id、季节id、propID、费率

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
是从另一个表来的,对吗?对不起,你是对的,忽略我的评论。我明白你说的很好,很简单,现在就试试。好的,它很好,有一个问题:我一开始就挂了。