为每组值创建 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的主要内容,如果未能解决你的问题,请参考以下文章

Hive - 如何获取每组值的分位数

每组值的自定义序列/自动增量

每组值的自定义序列/自动增量

Oracl Over函数

开窗函数是啥?

为每组选择随机行