Сортировка данных по дате

Тема в разделе "Как сделать...", создана пользователем Sunday, 27 мар 2012.

  1. Sunday

    Sunday

    Регистр.:
    13 дек 2009
    Сообщения:
    758
    Симпатии:
    326
    Подскажите пожалуйста, как с помощью PHP лучше отсортировать полученные данные из базы по дате?
    К примеру я выбрал все фотографии за последние 10 дней. Мне нужно вывести эти фотки по датам. Т.е.

    20-е марта
    [] [] [] [] []

    21-е марта
    [] [] [] [] []

    и т.д.

    Не хочется на каждую дату делать отдельный запрос - это печально и не правильно.
     
  2. polyetilen

    polyetilen Заблокирован

    Регистр.:
    10 авг 2006
    Сообщения:
    814
    Симпатии:
    474
    например в массив сохранять, в котором индекс это дата
    PHP:
    $photo[$row['date']][] = $row['photo'];
    получится массив с датами и фото для каждой даты.

    В MySQL базе тоже возможно сгрупировать по дате:
    Код:
    SELECT GROUP_CONCAT(photo) spisok_fotok, date
    FROM fotki
    GROUP BY date
    ORDER BY date
    получится список дат и фоток через запятую, а в php потом список с запятыми через explode сконвертировать в массив
    PHP:
    $fotki explode(","$row['spisok_fotok']);
     
    Sunday нравится это.
  3. Sunday

    Sunday

    Регистр.:
    13 дек 2009
    Сообщения:
    758
    Симпатии:
    326
    Погуглил я по этому вопросу.
    Вроде всё просто на простых примерах, в которых выборка из одной таблицы.
    http://www.dev-area.ru/archives/47
    http://webi.ru/webi_articles/8_14_f.html
    Но у меня что-то ничего не выходит с моей выборкой из двух таблиц.
    Запрос у меня такой
    Код:
    SELECT
        GROUP_CONCAT(A.photo_name) as photo_name,
        DATE_FORMAT(B.date_add,'%d.%m.%Y') as date
    FROM
        photo A, posts B
    WHERE
        A.id_post=B.id
    GROUP BY date
    ORDER BY date
    
    Далее, как было предложено, в цикле через explode я вывел список всех фоток отсортированных по дате. Но получается, что выводится всё по одной фотке из каждого поста, т.к. я использую $fotki[0]. Не догоняю, как вывести все существующие фотки каждого поста для определенной даты. :nezn:
    Примерно так:
    Код:
     while($row=mysql_fetch_assoc($query)) {
        $fotki = explode(",", $row['photo_name']);
        echo '<img src="/images/$fotki[0]" />';
    }
    
    В каком месте я нуб?
     
  4. polyetilen

    polyetilen Заблокирован

    Регистр.:
    10 авг 2006
    Сообщения:
    814
    Симпатии:
    474
    А что с запросом? Нормальный запрос.

    так как $fotki это массив, вывести все элементы например с циклом foreach
    PHP:
    foreach($fotki as $fotka){
        echo 
    "<img src=\"/images/$fotka\" />";
    }
     
    Sunday нравится это.
  5. Sunday

    Sunday

    Регистр.:
    13 дек 2009
    Сообщения:
    758
    Симпатии:
    326
    Да, спасибо, с этим все в порядке.
    Но с датой не могу разобраться. У меня выводится дата для каждой фотки, а не для группы :facepalm:
     
  6. polyetilen

    polyetilen Заблокирован

    Регистр.:
    10 авг 2006
    Сообщения:
    814
    Симпатии:
    474
    надо сначала дату вывести, а потом цикл с фотками
    PHP:
    while($row=mysql_fetch_assoc($query)) {
        echo 
    $row['date'];
        
    $fotki explode(","$row['photo_name']);
        foreach(
    $fotki as $fotka){
            echo 
    '<img src="/images/'.$fotka.'" />';
        }
    }
     
    Sunday нравится это.
  7. Sunday

    Sunday

    Регистр.:
    13 дек 2009
    Сообщения:
    758
    Симпатии:
    326
    Почти получилось. А почти, потому что получилось не так, как хотелось.
    Сейчас получается, что дата выводится для каждой публикации.
    Т.е. так
    20.03.2012
    [][]
    20.03.2012
    []
    20.03.2012
    [][][][]

    А хотелось бы
    20.03.2012
    [][][][][][][]

    Может еще что-то в запросе подшаманить нужно?
     
  8. polyetilen

    polyetilen Заблокирован

    Регистр.:
    10 авг 2006
    Сообщения:
    814
    Симпатии:
    474
    а может в запросе группирует не по сформатированной дате в которой есть время
    GROUP BY B.date_add
    поэтому могут попаатся одинаковые дни но в разных группах, потому что время разное
    если было
    DATE_FORMAT(B.date_add,'%d.%m.%Y') AS date
    то групировать надо по тому же формату даты
    GROUP BY date
    или
    GROUP BY DAY(B.date_add)
    когда группирование не более месяца
     
    Sunday нравится это.
  9. Sunday

    Sunday

    Регистр.:
    13 дек 2009
    Сообщения:
    758
    Симпатии:
    326
    Да, точно, что-то я протупил, так и есть.
    Мучался, мучался, а в итоге GROUP_CONCAT со своим ограничением 1024 сделал мне большой облом... некоторые фотки не помещаются в этот лимит... :hi:

    Я так понимаю, что если это виртуальный хостинг, то только ТП в состоянии увеличить этот лимит?
     
  10. polyetilen

    polyetilen Заблокирован

    Регистр.:
    10 авг 2006
    Сообщения:
    814
    Симпатии:
    474
    а если перед запросом сделать ещё запрос на повышения ограничения
    Код:
    SET SESSION group_concat_max_len = 1000000;
     
    Sunday нравится это.