0

我有一个网站,列出了可供出租的公寓。我的 MySQL 数据库中有几个不同的表。一张表格是关于整个公寓楼的基本信息,包括地址、便利设施、照片、身份证 (NID) 等。

另一个表格列出了每栋建筑内可供出租的单元。所以每栋公寓楼都有多个平面图,有几个工作室,几个一居室单元,有时还有几个二居室单元等。

目前我查询我的“单元”表并询问给定公寓楼中的所有单元。我的查询看起来像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 个卧室单元,如果有,则打印另一行。请问这栋楼有三房单位吗?如果是这样打印另一行,但我想停止这么多地访问我的数据库。

最后,这是我的问题:

如何存储我的第一个数据库调用的结果并以某种方式解析数据并确定给定的 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,但其他数据库连接库的概念相同)

$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

尝试将此作为您的数据库查询,它将为每个建筑物为其拥有的每种单元类型生成一行。您还可以将其用作子查询并连接到父表,以便一次性获取有关建筑物的任何其他详细信息。

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 回答