Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Replacing redundant dates in DB query with symbol (MySQL/PHP)

Tags:

php

mysql

I have a database query that displays a list of historic events in chronological order, like this:

(URL = MySite/Calendar/January_1)<br>
On this day in history...<br>
1968 - A volcano erupted.<br>
1968 - A country was invaded.<br>
1968 - Someone had a hit song.<br>
1970 - A famous person was born.

I'd like to know if there's a way to display a year just once, so the display looks like this:

1968 - A volcano erupted.<br>
&#8226; A country was invaded.<br>
&#8226; Someone had a hit song.<br>
1970 - A famous person was born.

Let's start with a database table (calendar_px) that lists the dates of various historic political events. The table has five fields -

1) N (a simple numerical key)
2) URL (values - such as May_1 - match page URL's)
3) Year (e.g. 1970, but the field type is INT, not Year, which only goes back to 1901)
4) Brief (some brief content)
5) Date (field type will be either date or datetime; I'm not actually using this field at the moment)

Here's what my code looks like (where $MyURL equals the page URL; e.g. January_1):

$stm = $pdo->prepare("SELECT Cal2.N, Cal2.URL, Cal2.Date, Cal2.Year, Cal2.Brief
 FROM calendar_px Cal2
 WHERE Cal2.URL = :MyURL
 ORDER BY Cal2.Year");
$stm->execute(array(
 'MyURL'=>$MyURL
));

while ($row = $stm->fetch())
{
 $Year = $row['Year'];
 $Brief[] = ''.$Year.' &#8211; '.$row['Brief'].'';
}

Then, I display a list of historic events like this...

echo join( $Brief, '<br>' );

I don't think it really changes anything, but I should mention that I have a similar set up on several websites; everything is the same except for the table names: calendar_gw, calendar_gz, calendar_gs, calendar_px, calendar_sl

Accordingly, I've joined all five tables together with a UNION command. Here's a portion of the query:

$stm = $pdo->prepare("SELECT CGW.N, CGW.URL, CGW.Date, CGW.Year, CGW.Brief
 FROM calendar_gw CGW
 WHERE CGW.URL = :MyURL
 UNION ALL
 SELECT CGZ.N, CGZ.URL, CGZ.Date, CGZ.Year, CGZ.Brief
 FROM calendar_gz CGZ
 WHERE CGZ.URL = :MyURL
 UNION ALL
 SELECT CSL.N, CSL.URL, CSL.Date, CSL.Year, CSL.Brief
 FROM calendar_sl CSL
 WHERE CSL.URL = :MyURL
 ORDER BY Year");
$stm->execute(array(
'MyURL'=>$MyURL
));

Anyway, my goal is the same; to replace redundant dates (years) with some sort of "dingbat" or symbol.


1 Answers

$prevYear = null;
while ($row = $stm->fetch())
{
    $Year = $row['Year'];
    if ($Year == $prevYear) {
        $YearStr = '&#8226; ';
    } else {
        $YearStr = $Year . ' $#8211; ';
        $prevYear = $Year;
    }
    $Brief[] = $YearStr.$row['Brief'];
}

P.S. You don't need to concatenate '' at each end of the string.

like image 116
Barmar Avatar answered Nov 30 '25 03:11

Barmar



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!