0

賃貸可能なアパートの一覧を掲載したウェブサイトがあります。MySQLデータベースにいくつかの異なるテーブルがあります。1つの表は、住所、アメニティ、写真、ID(NID)など、アパート全体の基本情報を示しています。

別の表は、各建物内で賃貸可能なユニットを示しています。したがって、各アパートの建物には複数のフロアプランがあり、いくつかのスタジオ、いくつかの1ベッドルームユニット、場合によってはいくつかの2ベッドルームユニットなどがあります。

現在、「ユニット」テーブルを照会して、特定のアパートの建物内のすべてのユニットを要求しています。私のクエリは次のようになりますSELECT * FROM node_unit WHERE nid='555'

これにより、次のような結果が返される場合があります。

NID    Name       Rent    SqFT    Bedrooms    Bathrooms
555    Unit 1     $500    620      0            1
555    Unit 2     $550    680      0            1
555    Unit 3     $600    820      1            1
555    Unit 4     $650    920      1            1
555    Unit 5     $700    1220     2            1
555    Unit 6     $800    1420     2            2
555    Unit 7     $900    1500     3            2
555    Unit 8     $1100   1620     3            3

などなど

私がPHPで行っているのは、アコーディオンを使用して1つの寝室をグループ化し、2つの寝室をグループ化することです。

すべてのアパートメントに2ベッドルームユニットがあるわけではなく、1ベッドルームユニットしかないアパートメントもあるため、別のアコーディオンを印刷する必要があるかどうかをPHPコード内で知る必要があります。

現在、データベースへの複数のヒットを使用して、特定の建物に2つの寝室ユニットがあるかどうかを判断しています。ある場合は、別の行を印刷します。この建物には3ベッドルームユニットがありますか?もしそうなら、別の行を印刷しますが、データベースへのアクセスをあまり止めたいと思います。

最後に、ここに私の質問があります:

最初のDB呼び出しの結果を保存し、データを解析して、特定のNIDにスタジオ、1ベッド、2ベッドなどがあるかどうかを判断するにはどうすればよいですか?(私は最近PHP / MySQLを学び始めました)

4

2 に答える 2

1

私はこのようなクエリを提案します:

SELECT * FROM node_unit WHERE nid='555'
ORDER BY Bedrooms ASC, Bathrooms ASC, Rent ASC

これにより、寝室の数、浴室の数、家賃の金額の順に並べられたレコードが返されます(この順序で)。

このようにデータベースから読み取るときに、これを多次元配列に簡単に格納できます(にmysqli格納された結果セットでの使用を想定しています$resultが、概念は他のDB接続ライブラリでも同じです)

$room_array = array();
while ($row = mysqli_fetch_assoc($result)) {
    $room_array[(int)$row['Bedrooms']][] = $row;
}

これで、寝室の数を最初のインデックスとして持つ多次元配列ができました。次の場合、配列は次のようにvar_dumpなります。

Array (
    [0] => Array (
        [0] => Array (
            'NID' => '555',
            'Name' => 'Unit 1',
            'Rent' => '$500',
            'SqFt' => '620',
            'Bedrooms' => '0',
            'Bathrooms' => '1',
        )
        [1] => Array (
            'NID' => '555',
            'Name' => 'Unit 2',
            'Rent' => '$550',
            'SqFt' => '680',
            'Bedrooms' => '0',
            'Bathrooms' => '1',
        )
    )
    [1] => Array (
        [0] => Array (
            'NID' => '555',
            'Name' => 'Unit 3',
            'Rent' => '$600',
            'SqFt' => '820',
            'Bedrooms' => '1',
            'Bathrooms' => '1',
        )
        [1] => Array (
            'NID' => '555',
            'Name' => 'Unit 4',
            'Rent' => '$650',
            'SqFt' => '920',
            'Bedrooms' => '1',
            'Bathrooms' => '1',
        )
    [2] => Array (
        ...
    )
    [3] => Array (
        ...
    )
)

これにより、外側のループで寝室の数の値を反復処理してアコーディオンを作成し、次に内側のループで個々の部屋を反復処理することが非常に簡単になります。

foreach ($room_array as $num_bedrooms => $rooms) {
    // start accordion
    foreach ($rooms as $room) {
        // output room details
    }
    // end accordion
}

これはすべて、単一のクエリのみを必要とします。

また、寝室、バスルーム、家賃(またはソートで使用する方)、およびフィルターとして使用されるため、nidにもインデックスがあることを確認してください。

于 2012-11-13T19:56:57.810 に答える
1

これをデータベースクエリとして試してください。建物ごとに、ユニットタイプごとに行が生成されます。また、サブクエリとして使用し、親テーブルに結合して、建物について必要なその他の詳細を1回で取得することもできます。

select 'studio' as unit_type, nid from node_unit group by nid having count(case when bedrooms = 0 then 1 end) > 0
union all
select 'one bedroom' as unit_type, nid from node_unit group by nid having count(case when bedrooms = 1 then 1 end) > 0
union all
select 'two bedroom' as unit_type, nid from node_unit group by nid having count(case when bedrooms = 2 then 1 end) > 0
union all
select 'three bedroom' as unit_type, nid from node_unit group by nid having count(case when bedrooms = 3 then 1 end) > 0

于 2012-11-13T20:24:47.407 に答える