按日期对MySQL查询结果进行分组,每个组都有标题和自己的div
问题描述:
I feel like I may be over-thinking this solution... so I figured I'd get some additional advice. I want to query my database for a list of 'events' and group events that have the same date under a single header in addition, I want this 'group' in it's own container. I've figured out the single header issue browsing other questions, but the container is giving me grief!
For Example:
This:
<div class='container'>
<img src='event-image.jpg'>
<h1>October 15th, 2012</h1>
<h3>Event Name</h3>
<p>Details</p>
<h3>Event Name</h3>
<p>Details</p>
<h3>Event Name</h3>
<p>Details</p>
</div>
<div class='container'>
<img src='event-image.jpg'>
<h3>Event Name</h3>
<p>Details</p>
<h3>Event Name</h3>
<p>Details</p>
<h3>Event Name</h3>
<p>Details</p>
</div>
Not This:
<div class='container'>
<img src='event-image.jpg'>
<h1>October 15th, 2012</h1>
<h3>Event Name</h3>
<p>Details</p>
</div>
<div class='container'>
<h3>Event Name</h3>
<p>Details</p>
</div>
<div class='container'>
<h3>Event Name</h3>
<p>Details</p>
</div>
<div class='container'>
<img src='event-image.jpg'>
<h3>Event Name</h3>
<p>Details</p>
</div>
<div class='container'>
<h3>Event Name</h3>
<p>Details</p>
</div>
<div class='container'>
<h3>Event Name</h3>
<p>Details</p>
</div>
This:
October 15, 2012
Event 1
Event 2
Event 3
Not This:
October 15, 2012
Event 1
October 15, 2012
Event 2
October 15, 2012
Event 3
MySQL Query:
$sql = "SELECT title, DATE_FORMAT(date, '%M %D, %Y') AS postdate, time, venue, cost, city, spotlight, image
FROM shows WHERE date >= $curDate
ORDER BY date ASC, spotlight DESC LIMIT $startRow," . SHOWMAX;
HTML/PHP:
<?php
$prevDate = null;
while ($row = $result->fetch_assoc()) { ?>
<div class="content">
<?php
if (!empty($row['image'])) { ?>
<img src="/images/thumbs/<?php echo $row['image'] ?>">
<?php
}
if ($row['postdate'] != $prevDate) { ?>
<h1><?php echo $row['postdate']; ?></h1>
<?php $prevDate = $row['postdate'];
} ?>
<h3><?php echo $row['title']; ?></h3>
<p><?php echo $row['venue'] . " | " . $row['city'] . " | " . $row['time'] . " | " . $row['cost']; ?></p>
</div>
<div class="horizontal-line"></div>
<?php } ?>
Results:
<div class="content">
<img src="/images/thumbs/defining-times-news-00.jpg">
<h1>October 13th, 2012</h1>
<h3>Relient K w/ Hellogoodby, William Beckett & House of Heroes</h3>
<p>Cain's Ballroom | Tulsa, OK | 9:00 | $10</p>
</div>
<div class="horizontal-line"></div>
<div class="content">
<h3>Rod Steward & Stevie Nicks</h3>
<p>BOK Center | Tulsa, OK | 9:00 | $45</p>
</div>
<div class="horizontal-line"></div>
<div class="content">
<h3>Gary Allan</h3>
<p>Hard Rock Hotel & Casino | Tulsa, OK | 9:00 | $30</p>
</div>
<div class="horizontal-line"></div>
<div class="content">
<img src="/images/thumbs/dead-sea-choir-news-00.jpg">
<h1>October 14th, 2012</h1>
<h3>Nalani Proctor and Kierston White</h3>
<p>Bluebonnet | Norman, OK | 9:00 | $5</p>
</div>
<div class="horizontal-line"></div>
<div class="content">
<h3>Bungalouski</h3>
<p>Bluebonnet | Norman, OK | 9:00 | FREE</p>
</div>
<div class="horizontal-line"></div>
<h3>Relient K w/ Hellogoodby, William Beckett & House of Heroes</h3>
<p>Cain's Ballroom | Tulsa, OK | 9:00 | $10</p>
</div>
<div class="horizontal-line"></div>
I hope this isn't too convoluted! Any help is appreciated! Thanks!
答
Try this:
$prevDate = null;
while ($row = $result->fetch_assoc()) {
$mark = false;
if ($row['postdate'] != $prevDate) {
$mark = true;
$prevDate = $row['postdate'];
}
?>
<? if ($mark) { ?>
<div class="content">
<? } ?>
<? if (!empty($row['image'])) { ?>
<img src="/images/thumbs/<?= $row['image'] ?>">
<? } ?>
<? if ($mark) { ?>
<h1><?= $row['postdate']; ?></h1>
<? } ?>
<h3><?= $row['title']; ?></h3>
<p><?= $row['venue'] . " | " . $row['city'] . " | " . $row['time'] . " | " . $row['cost']; ?></p>
<? if ($mark) { ?>
</div>
<div class="horizontal-line"></div>
<? } ?>
<? } ?>
答
I got it working thanks to 'khomyakoshka' for leading me in the right direction!
...now I'm not saying this is the best way to do it, but it works!
<?php
$prevDate = null;
$i = 0;
while ($row = $result->fetch_assoc()) {
$mark = false;
if ($row['postdate'] != $prevDate) {
$mark = true;
$prevDate = $row['postdate'];
}
if ($mark && $i == 0) {
?>
<div class="content">
<?php
} elseif ($mark) {
?>
<div class="clear"></div>
</div>
<div class="horizontal-line"></div>
<div class="content">
<?php
}
if (!empty($row['image'])) {
?>
<img src="/images/thumbs/<?= $row['image'] ?>">
<?php
}
if ($mark) { ?>
<h1><?php echo $row['postdate']; ?></h1>
<?php
}
?>
<h3><?php echo $row['title']; ?></h3>
<p><?php echo $row['venue'] . " | " . $row['city'] . " | " . $row['time'] . " | " . $row['cost']; ?></p>
<?php
$i++;
}
?>
<div class="clear"></div>
</div>