簡體   English   中英

如何在SQL的某個列上連接具有相同值的2個或更多行?

[英]How to join 2 or more rows with same values at some column in SQL?

我想在我的網頁中創建一個動態選擇列表菜單 選擇列表菜單顯示11:00:00到02:00:00之間的時鍾。 如果保留一個或多個時鍾,則時鍾字體將變為紅色 首先,我將第一行插入IdRsv = RV01的表中,並在我的網頁中檢查結果。 選擇列表菜單顯示12:00:00至14:00:00變為紅色。 因此,結果很好。

當我在那之后插入另一行時出現我的問題。 我想要的結果是選擇列表菜單,菜單顯示12:00:00-14:00:0017:00:00-20:00:00的字體都變成紅色。 我得到的結果只有12:00:00-14:00:00的字體變成紅色。

我意識到選擇列表菜單僅讀取第一行。

表名稱:tblreservation
-------------------------------------------------- ---------------------
| IdRsv | IdRoom | RsvDate | StartRsv | EndRsv |
-------------------------------------------------- ---------------------
| RV01 | R003 | 2016-01-31 | 12:00:00 | 14:00:00 |
| RV02 | R003 | 2016-01-31 | 17:00:00 | 20:00:00 |
-------------------------------------------------- ---------------------

我嘗試的查詢只是SELECT * FROM table WHERE IdRoom ='$ idRoom'AND RsvDate ='$ rsvDate'
我使用條件來在選擇列表菜單選擇時鍾選項。
條件里面,我使用if條件使保留的時鍾字體變成紅色。

php代碼是:

$sql  = mysql_query("SELECT * FROM tblreservation WHERE IdRoom = '$idRoom' AND RsvDate = '$rsvDate'");
$data = mysql_fetch_array($sql);
echo"
     <select name='startClock' onchange='startClockFunction(this.value)' id='sc' class='form-control' required>
         <option value=''>--:--</option>";
         while ($data = mysql_fetch_array($sql)) {
             for ($clock = 11; $clock < 27; $clock++) {
                 if ($clock == 24) {
                      $showClock = "00";
                 } 
                 else if ($clock == 25) {
                      $showClock = "01";
                 }
                 else if ($clock == 26) {
                      $showClock = "02";
                 } else {
                      $showClock = $clock;
                 }

                 if ($data['StartRsv'] == "" && $data['EndRsv'] == "") {
                      echo "<option value='$clock:00:00'>$showClock:00</option>";
                 }
                 else if ($clock . ":00:00" >= $data['StartRsv'] && $clock . ":00:00" <= $data['EndRsv']) {
                     echo "<option style='background-color: red; color: white;' value='$clock:00:00' disabled>$showClock:00</option>";
                 }
                 // if someone reserve room at 22:00:00 until 02:00:00 (example)
                 else if ($data['StartRsv'] > $data['EndRsv']) {
                     $dataEndRsv = $data['EndRsv'] + 24;
                     if ($clock . ":00:00" >= $data['StartRsv'] && $jam . ":00:00" <= $dataEndRsv) {
                         echo "<option style='background-color: red; color: white;' value='$clock:00:00' disabled>$showClock:00</option>";
                     } else {
                         echo "<option value='$jam:00:00'>$jamTampil:00</option>";
                     }
                 }
                 else {
                      echo "<option value='$clock:00:00'>$showClock:00</option>";
                 }
              }
          }
echo"
      </select>
    ";



EDITED

這是使用while條件捕獲的我的選擇列表菜單 看看我的光標懸停在哪里。 它顯示時鍾循環被循環兩次,因為查詢的結果是2行。

問題是如何使我的選擇列表菜單顯示12:00:00-14:00:0017:00:00-20:00:00的字體都變成紅色? 我應該在哪里放置條件?

如果我的英語不好我很抱歉。 提前致謝...

擴展@Dunno的答案。 您需要使用while循環來獲取所有行。 然后,您需要一個數組$occupied_hours來跟蹤已花費的時間:

$sql  = mysql_query("
    SELECT hour(StartRsv) s, hour(EndRsv) e
    FROM tblreservation 
    WHERE IdRoom = '$idRoom' AND RsvDate = '$rsvDate'");

$occupied_hours = array();
while ($row = mysql_fetch_array($sql)) {
    for ($i = $row['s']; $i <= $row['e']; $i++) {
        $occupied_hours[$i] = true;
    }
}

echo"<select name='startClock' onchange='startClockFunction(this.value)' id='sc' class='form-control' required>
    <option value=''>--:--</option>";

for ($clock = 11; $clock < 27; $clock++) {
    $clock = $clock % 24;
    if ($clock < 10) {
        $showClock = "0" . $clock;
    }

    if (isset($occupied_hours[$clock])) {
        echo "<option style='background-color: red; color: white;' value='$clock:00:00' disabled>$showClock:00</option>";
    } else {
        echo "<option value='$clock:00:00'>$showClock:00</option>";
    }
}
echo" </select> ";

首先,for循環中的第一個if語句是無用的,因為循環以$clock = 11開始,並且您正在檢查$clock是否小於10。

對於您的實際問題,由於要獲取多行,因此必須使用while循環遍歷mysql_fetch_array($sql)的結果。

$sql  = mysql_query("SELECT * FROM tblreservation WHERE IdRoom = '$idRoom' AND RsvDate = '$rsvDate'");

echo"<select name='startClock' onchange='startClockFunction(this.value)' id='sc' class='form-control' required>
     <option value=''>--:--</option>";
while( $row = mysql_fetch_array($sql) ){
    for ($clock = 11; $clock < 27; $clock++) {
         if ($clock == 24) {
              $showClock = "00";
         } 
         else if ($clock == 25) {
              $showClock = "01";
         }
         else if ($clock == 26) {
              $showClock = "02";
         } else {
              $showClock = $clock;
         }

         if ( $row['StartRsv'] == "" && $row['EndRsv'] == "" ) {
              echo "<option value='$clock:00:00'>$showClock:00</option>";
         }
         else if ($clock . ":00:00" >= $row['StartRsv'] && $clock . ":00:00" <= $row['EndRsv']) {
              echo "<option style='background-color: red; color: white;' value='$clock:00:00' disabled>$showClock:00</option>";
         }
         else if ("00:00:00" >= $row['StartRsv'] && "01:00:00" <= $row['EndRsv']) {
              echo "<option style='background-color: red; color: white;' value='$clock:00:00' disabled>$showClock:00</option>";
         } 
         else if ("00:00:00" >= $row['StartRsv'] && "02:00:00" <= $row['EndRsv']) {
              echo "<option style='background-color: red; color: white;' value='$clock:00:00' disabled>$showClock:00</option>";
         } else {
              echo "<option value='$clock:00:00'>$showClock:00</option>";
         }
    }
}
echo"
      </select>
    ";  

更新的解決方案

$time_slots = [];

$sql  = mysql_query("SELECT * FROM tblreservation WHERE IdRoom = '$idRoom' AND RsvDate = '$rsvDate'");

echo"<select name='startClock' onchange='startClockFunction(this.value)' id='sc' class='form-control' required>
     <option value=''>--:--</option>";

$reserved_slots = [];
while( $row = mysql_fetch_array($sql) ){
    if( !empty($row['StartRsv']) && !empty($row['StartRsv']) ){
        $reserved_slots[] = [
            'start' => $row['StartRsv'],
            'end' => $row['EndRsv']
        ];
    }
}

for ($clock = 11; $clock < 27; $clock++) {
    $c = $clock . ":00:00";
    $time_slots[] = [
        'key' => $c,
        'display_time' => $clock%24 . ":00:00",
        'is_reserved' => isThisTimeReserved($reserved_slots, $c)
    ];
}

foreach($time_slots as $slot){
    $style = $slot['is_reserved'] ? "style='background-color: red; color: white;'" : "";
    $disabled = $slot['is_reserved'] ? "disabled" : "";
    echo "<option $style value='$clock:00:00' $disabled>$showClock:00</option>";
}
echo"
      </select>
    ";  

//To check if a time slot is reserved or not
function isThisTimeReserved($reserved_slots, $clock){
    return ($clock . ":00:00" >= $reserved_slots['start'] && $clock . ":00:00" <= $reserved_slots['end']);
}

這似乎是您的php代碼中的錯誤。 mysql_fetch_array僅返回結果的一行,您必須使用while循環對它們進行迭代,如下所示:

while ($data = mysql_fetch_array($sql)) {
    ...
}

參考

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM