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

Рано обрадовался, что всё работает. :eek: Работает, но только визуально.
У меня каждая картинка - это ссылка на публикацию к которой она относится. И теперь получается, что в каждой группе все картинки ведут на одну и ту же публикацию.
Я так понимаю суть в том, что я вывожу ссылку так
Код:
foreach($fotki as $fotka){
    echo "<a href=""><img src=\"/images/$fotka\" /></a>";
}
а ссылка должна быть вне цикла foreach?
Как можно поступить в этом случае?
 
ссылки тоже можно собрать в список, как и фотки, например если ссылки постов состоят из ид поста, то запрос
Код:
SELECT
    GROUP_CONCAT(A.photo_name) AS photo_name,
    GROUP_CONCAT(A.id_post) AS post_id,
    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
будут два списка, которые перевести в массивы и использовать их
PHP:
while($row=mysql_fetch_assoc($query)) {
    echo $row['date'];
    //массив фоток
    $fotki = explode(",", $row['photo_name']);
    //массив постов индексы совпадают с массивом фоток
    $posty = explode(",", $row['post_id']);
    //цикл по фоткам, $index_id - индекс элемента массива, $fotka - значение элемента массива
    foreach($fotki as $index_id=>$fotka){
        //если индекс $index_id в массиве фоток известен, а индексы совпадают у обоих массивов,
        //значит под таком же индексом будет пост в массиве постов $posty[$index_id]
        //тогда если ссылка например http://example.com/post_id/ид_поста
        echo '<a href="http://example.com/post_id/'.$posty[$index_id].'"><img src="/images/'.$fotka.'" /></a>';
    }
}

если трудно разобратся, то попроще вариант когда все фотки складываются в многомерный массив и без запроса с групировкой

PHP:
<?
$db = mysql_connect("localhost", "root", "") or die("error");
mysql_select_db('test');
mysql_query("SET NAMES 'utf8'");
 
$dannye = array();
 
$sql = "
    SELECT A.photo_name, B.id, DATE_FORMAT(B.date_add,'%d.%m.%Y') AS date
    FROM
        photo A, posts B
    WHERE
        A.id_post=B.id
    ORDER BY DATE
";
 
$result = mysql_query($sql);
while($row = mysql_fetch_assoc($result)) {
    //данные собираем в массив, индекс каждого элемента дата
    $dannye[$row['date']][] = array('photo'=>$row['photo_name'], 'link_id'=>$row['id']);
}
 
//теперь цикл по собранным данным
foreach($dannye as $date=>$fotki){
    //вывод даты
    echo '<h2>'.$date.'</h2>';
    //цикл по фоткам
    foreach($fotki as $fotka){
        echo '<a href="http://example.com/post_id/'.$fotka['link_id'].'"><img src="/images/'.$fotka['photo'].'" /></a>';
    }
}
 
если трудно разобратся
Трудностей не было пока не вздумал использовать LIMIT в запросе. Использую вариант с многомерным массивом.
Сейчас получается так, что LIMIT действует для всего списка выводимых данных, а хотелось бы, чтобы установленный лимит работал внутри каждой группы. Такое возможно?
 
наверное придётся разделять на два запроса или в цикле сделать ограничение как бы LIMIT
PHP:
//цикл по фоткам
$limit = 10;
foreach($fotki as $fotka){
    echo '<a href="http://example.com/post_id/'.$fotka['link_id'].'"><img src="/images/'.$fotka['photo'].'" /></a>';
    $limit --;
    if($limit<=0)break;
}
 
Этот вариант я сразу отмел, т.к. будет выборка всех(!) данных, а потом отсекание ненужных. Это не критично, если данных не много, но данных много - более 40000 строк.
А в случае со вторым запросом, я так понимаю его нужно делать уже в цикле с датой?

UPDATE
Я решил совместить эти два лимита. Т.к. мне заранее известно кол-во групп, и если в каждой группе выводить по 10 фоток, то значит лимит в запросе нужно установить 10 умноженное на кол-во групп. А в цикле поставить счетчик и останавливать цикл на 10. Таким образом все данные разделятся поровну.
Теоретически вроде все верно. Только что-то не срабатывает этот вариант. В 1-й группе выводится установленный лимит в запросе, а в остальных не понятно как-то - где по 1, где по 3.
Получается, что счетчик в цикле почему-то не работает
 
Ещё можно использовать UNION ALL, например 3 запроса с ограничением на две фотографии за последние три дня соединены вместе:
Код:
(SELECT A.photo_name, B.id, DATE_FORMAT(B.date_add,'%d.%m.%Y') AS date
FROM photo A, posts B
WHERE A.id_post=B.id AND DATE_SUB(NOW(), INTERVAL 1 DAY)<B.date_add
LIMIT 2)
UNION ALL
(SELECT A.photo_name, B.id, DATE_FORMAT(B.date_add,'%d.%m.%Y') AS date
FROM photo A, posts B
WHERE A.id_post=B.id AND DATE_SUB(NOW(), INTERVAL 2 DAY)<B.date_add
LIMIT 2)
UNION ALL
(SELECT A.photo_name, B.id, DATE_FORMAT(B.date_add,'%d.%m.%Y') AS date
FROM photo A, posts B
WHERE A.id_post=B.id AND DATE_SUB(NOW(), INTERVAL 3 DAY)<B.date_add
LIMIT 2)
 
Назад
Сверху