[英]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:00和17: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:00和17: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.