1

だから私はこのコードを持っています。テーブル「rom」から部屋のリストを取得し、「booket」の同じ部屋に対してこれをチェックすることになっています。設定された時間内に予約されていない部屋を印刷するにはどうすればよいですか。

「Rom」データベースは次のようになります。

romnavn   | romtype (not relevant here)

ex: 81-77 | 2

「ブックレット」は次のようになります。

romnavn   | bruker      | dato       | fra | til

ex: 81-77 | foo@bar.net | 03.04.2013 | 16  | 18

(これは、部屋が16:00:00から18:00:00まで予約されることを意味します)

部屋が両方のクエリに表示される場合は、無視する必要があります。

私の推測では$notFreeA、最初のループ内に 2 つの while ループ " " がありましたが、必要な結果が得られません。

DBとクエリの両方が悪いと確信していますが、何か助けていただければ幸いです:)

require "sql/sqlConnect.php";
require "functions/functions.php";
date_default_timezone_set('Europe/Oslo');
$time = date('H:i:s');
$date = date('d.m.Y');
$nearestHour = roundToNearestHour($time);

$allRooms = "SELECT * FROM rom";
$notFree = "SELECT * FROM booket WHERE dato='$date' AND fra<='$nearestHour';";

$allRoomA = mysql_query($allRooms);
$notFreeA = mysql_query($notFree);

最も近い部屋に切り上げる/切り下げる関数は次のようになります。

function roundToNearestHour($time) {
$part = explode(":", $time);

if(count($part) != 3)
  return 0;

if($part[2] > 30)
  $parts[1]++;

if($part[1] > 30)
  $part[0]++;

return $part[0];
}
4

2 に答える 2

1

1 つのクエリでこれを試してください。

select *
from room r
where r.romnavn not in (select roomnavn booket WHERE dato='$date' AND fra<='$nearestHour')
于 2013-04-03T14:58:12.847 に答える
1

これを行うために必要なクエリは 1 つだけです。次の 3 つのいずれかで、希望する結果が得られます。

SELECT * FROM rom WHERE NOT EXISTS 
  (SELECT * FROM booket WHERE dato='$date' AND fra<='$nearestHour'
   AND rom.romnavn = booklet.romnavn)

SELECT rom.* FROM rom LEFT OUTER JOIN booket USING romnavn
   WHERE dato='$date' AND fra<='$nearestHour' AND booket.romnavn IS NULL

SELECT * FROM rom WHERE romnavn NOT IN
   (SELECT romnavn FROM booket WHERE dato='$date' AND fra<='$nearestHour')

とはいえ、このテーブルのデザインは非常に貧弱です。ネイティブの日時型を使用していないようで、主キーの名前が不十分であり、インデックスを付けやすいものにする必要があります (整数 ID など)。

できる変更が 1 つだけの場合は、少なくとも、dato列が実際には varchar ではなく DATE 型であることを確認する必要があります。そのままでは、日付ベースのソートまたはフィルタリングを SQL で実行するのは非常に困難です。

于 2013-04-03T14:59:23.043 に答える