我有一个网站列出了可供出租的公寓。我的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个卧室单位,如果是,则打印另一行。这栋楼有3间卧室吗?如果是这样打印另一行,但我想停止点击我的数据库。
最后,这是我的问题:
如何存储我的第一个数据库调用的结果,并以某种方式解析数据,并确定给定的NID是否有工作室,1张病床,2张病床等? (我刚开始学习PHP / MySQL)
答案 0 :(得分: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上都有索引,因为它用作过滤器。
答案 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