Как использовать PHP для циклического прохождения набора результатов MySQL с записями, сгруппированными по десятилетиям? - PullRequest
1 голос
/ 04 марта 2012

Допустим, у меня есть куча записей в MySQL, что-то вроде этого:

ID |ДАТА |НАЗВАНИЕ
1 |1961-03-21 |Кошки
2 |1964-02-05 |Собаки
3 |1976-11-30 |Мыши
4 |1979-09-14 |Обезьяны

Что бы вы предложили в качестве способа вытащить все записи и отразить каждый из них в группе своего десятилетия?То есть я хочу, чтобы они были организованы даже в 10-летние промежутки, вроде как:

1960-е
запись 1
запись 2

1970-е
запись 3и т. д. и т. д.

В идеале, он будет распечатывать «десятилетние ярлыки» только в том случае, если на самом деле присутствует запись того десятилетия.

MySQL Group By не выглядит правильным.Как насчет цикла while со встроенным тестом if с использованием какого-либо математического теста для каждого года?

Я изо всех сил пытаюсь придумать что-нибудь элегантное, масштабируемое и многократно используемое в случае, если я не знаю, какие десятилетия (или столетия) будут присутствовать.

============ ОБНОВЛЕНИЕ =============

Используя предложение, предоставленное Col Shrapnel, это то, что я написал.Это именно то, что мне нужно.(Может ли это быть значительно более элегантно?)

<?php
// perform Query, sort by date, get your results, then...
$lastDecade = 0;
while($row = mysql_fetch_array($rows->list))
{
    $currentYear = date("Y",strtotime($row['date']));
    $currentDecade = floor((int)$currentYear/10)*10;
    if($currentDecade>$lastDecade)
    {
        echo "<h1>" . $currentDecade . "</h1>";
        $lastDecade = $currentDecade;
    }
        echo "<h2>" . $row['title'] . "</h2>";
}
?>

Ответы [ 2 ]

3 голосов
/ 04 марта 2012

Чтобы получить десятилетие от года, вы должны разделить его на 10, сложить и умножить обратно.

для сохранения текущего десятилетия есть переменная $ last_decade и проверка ее на текущую (а затем переписать с текущей)

выберите ваши записи, упорядоченные по дате

это все

1 голос
/ 04 марта 2012

Столбец, который вы хотите добавить, - truncate(year(from_unixtime(date))/10,0) as Decade. Затем вы хотите сделать заказ по Десятилетию в качестве основного ключа заказа, и в вашем цикле выборки обнаружить разрыв по Десятилетию.

(или пропустите from_unixtime(), если вы используете даты MySQL, а не PHP). Например,

$sql = 'SELECT ID, DATE, TITLE,
               truncate(year(DATE)/10,0)*10 as DECADE
        FROM   ALBUM_TABLE 
        ORDER BY 4,3';

если вы хотите сделать заказ по названию в течение десятилетия. Почему это связано с изменением вашей схемы ??

Если вы хотите сделать заказ строго по дате, то сделать это десятилетие в PHP, вероятно, проще, но это то, что вам нужно. Можете ли вы придумать лучший способ, если вы хотите заказать титул в течение десятилетия?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...