为每组值创建 Div
Posted
技术标签:
【中文标题】为每组值创建 Div【英文标题】:Create Divs for each group of values 【发布时间】:2021-08-09 08:43:53 【问题描述】:我需要使用匹配的房间代码对所有行进行分组。当我还对度假村进行分组时,它就像禁用房间代码的分组一样,只给我第一行的结果和房间代码。
如何对度假村列进行分组,并且仍然对匹配的房间代码列进行分组?如果我取消组合我的度假村代码,查询将正常工作,但我无法为不同的度假村创建单独的 div。
用户正在搜索一个日期范围,因此具有相同房间代码的多行,这会获取我的积分。这就是为什么我得到这些点的总和。我目前为输出 html 目的对每个度假村进行分组的方式打破了这一点。我不一定要对度假村进行分组,我只需要在其自己的 DIV 集中创建的每个度假村的每个房间。下面我有一个基本的例子。
理想的 HTML 输出
<div id="results">
<div id="resort resortcode">
<div id="roomresults">
<div id="room1"></div>
<div id="room2"></div>
</div>
</div>
<div id="resort2 resortcode2">
<div id="roomresults2">
<div id="room3"></div>
<div id="room4"></div>
</div>
</div>
</div>
此 PHP 代码将按度假村对每组结果进行分组,但会抬高我的价格。
<?php
include("dbh.php");
mysqli_select_db($con, "checkavail") or die ("no database");
$checkin = $_POST['checkin'];
$checkout = $_POST['checkout'];
$occupants = $_POST['occupants'];
$sqlCommand=
"SELECT
MIN(staydate) AS checkin,
MAX(staydate) AS lastnight,
MIN(available) AS available,
ra.resort AS resortcode,
ri.resort,
ri.room,
ri.roomcode,
ri.view,
SUM(ra.points*'20') AS price,
ri.sqfoot,
ri.description,
ri.bedding,
ri.amenities,
ri.sleeps,
ri.sleep_details,
ri.layout_img AS layoutimg,
ri.room_img AS roomimg,
ri.roomimg_thumb
FROM resort_availability AS ra
LEFT JOIN room_info AS ri ON (ra.room = ri.roomcode)
WHERE staydate >= '$checkin' AND staydate = '$checkout'
AND sleeps >= '$occupants'
GROUP BY ri.roomcode
ORDER BY ri.resort, points
";
$result=mysqli_query($con, $sqlCommand) or die(mysqli_error($con));
$data = array();
while($row = $result->fetch_assoc())
$itemName = $row["resort"];
$resortCode = $row["resortcode"];
if ( !array_key_exists($itemName, $data))
$data[$itemName] = array ();
$data[$itemName][] = $row;
foreach ($data as $itemName => $rows)
echo '<div class="resort ' ,$resortCode , '">';
echo '<div class="resort_header"><h1>', $itemName, '</h1></div>';
foreach ($rows as $row)
if ($row['available'] > 0)
$roomresult = '<div class="room_result roomavailable">';
$available = '<button class="available">BOOK NOW</button>';
$filtavail = 'available';
else
$roomresult = '<div class="room_result roomsoldout" style="">';
$available = '<button class="soldout">SOLD OUT</button>';
$filtavail = 'soldout';
echo $roomresult;
echo '<div class="room_thumb"></div>
<div class="room_info"><h4>'
,$row['room'], '-' ,$row['view'] ,
'</h4></div>
<div class="price"><center><h3>','' ,$row['price'],'</h3>' , $available ,'</center></div></div>';
echo '</div>';
?>
这个 PHP 代码给了我准确的结果,但不允许我创建一个基于每个度假村 IE 的结果的 div,我不知道如何创建一个带有度假村名称的标题,分隔每组房间像第一个例子一样按手段。
<?php
include("dbh.php");
mysqli_select_db($con, "checkavail") or die ("no database");
$checkin = $_POST['checkin'];
$checkout = $_POST['checkout'];
$occupants = $_POST['occupants'];
$sqlCommand=
"SELECT
MIN(staydate) AS checkin,
MAX(staydate) AS lastnight,
MIN(available) AS available,
ra.resort AS resortcode,
ri.resort AS resort,
ri.room,
ri.roomcode AS roomcode,
ri.view,
SUM(ra.points) AS points,
ri.sqfoot,
ri.description,
ri.bedding,
ri.amenities,
ri.sleeps,
ri.sleep_details,
ri.layout_img AS layoutimg,
ri.room_img AS roomimg,
ri.roomimg_thumb
FROM resort_availability AS ra
LEFT JOIN room_info AS ri ON (ra.room = ri.roomcode)
WHERE staydate >= '$checkin' AND staydate < '$checkout'
AND sleeps >= '$occupants'
GROUP BY ri.resort, roomcode
ORDER BY ri.resort, points
";
$result=mysqli_query($con, $sqlCommand) or die(mysqli_error($con));
while($row = $result->fetch_assoc())
$pricecalc = ($row['points'])*20;
$price = number_format($pricecalc, 2);
//RESULTS BOX
if($row['available'] < "1")
echo '<div id="'.$row['roomcode'].'-'.$row['resortcode'].'"','class="soldout roomresults room'.$row['resortcode'].'">';
if($row['available'] > "0")
echo '<div id="'.$row['roomcode'].'-'.$row['resortcode'].'"','class="available roomresults room'.$row['resortcode'].'">';
//IMAGE BOX
echo '<div class="thumbnail"><img src="',$row['roomimg_thumb'],'">';
echo '</div>';
//ROOM DETAILS
echo '<div class="roomdetails">';
echo '<h4>'.$row['room'].' - '.$row['view'].'</h4>';
echo '<p>Sleeps: '.$row['sleep_details'].'</p>';
echo '<p class="clickfordetails">Click Image For Room Details</p>';
echo '</div>';
//PRICING BOX AND SUBMIT BUTTON
echo '<div class="price">';
echo '<h3>$',$price,'</h3>';
if ($row['available'] < "1")
echo '<button type="button" class="soldoutbtn">SOLD OUT</button>';
if ($row['available'] > "0")
echo '<button type="button" class="booknowbtn">BOOK NOW</button>';
echo '</div,$row>';
echo '</div></div>';
;
?>
【问题讨论】:
如果是我,我会从sql开始 为什么用户希望将自己限制在入住日期等于退房日期的房间?困惑。 价格由每晚决定。退房当天不包括在内,因为他们在退房当天不收费。因此,我的查询搜索到退房日期前一天的入住日期,因此定价是准确的。我正在使用另一种代码设置。一切都是准确的,它只是不允许我在 HTML 输出中对度假村进行分组。这段代码让我能够根据输出对度假村进行分组,但会搞砸我的查询结果,无论出于何种原因,我还没有理解。 请注意,WHERE... sleeps =...
将此查询呈现为 INNER JOIN。
您将不得不详细说明。我可以将此查询解析为 json 数组,它给了我 100% 正确的结果。所以,我不确定你在做什么。我只需要弄清楚如何为每个度假村创建一个标题,并在该 div 中列出该度假村的房间结果。
【参考方案1】:
是的group by
会给你同组的第一条记录。
据我了解,您希望显示所有数据,但将具有相同房间代码的所有记录放在一起。
在这种情况下,请更改
GROUP BY ri.roomcode
ORDER BY ri.resort, points
到
ORDER BY ri.roomcode, ri.resort, points
【讨论】:
这似乎没有什么不同。我将不得不睡在这个问题上,明天再报告一个更新的问题。我很感激这次尝试。 我用第二组代码和一些截图来帮助解释更新了这个问题。以上是关于为每组值创建 Div的主要内容,如果未能解决你的问题,请参考以下文章