Более одного документа на один пост ... есть идеи? - PullRequest
1 голос
/ 20 июля 2011
SELECT
    `posts`.`id`,
    `posts`.`created_at`,
    `posts`.`content`,
    `posts`.`replies`,
    `groups`.`id` AS `group_id`,
    `groups`.`name` AS `group_name`,
    `users`.`id` AS `user_id`,
    `users`.`name`,
    `users`.`surname`,
    `users`.`avatar`,
    `posts`.`link`,
    `posts`.`event_id`,
    `events`.`name` AS `event_name`,
    `docs`.`id` AS `attachment_id`
FROM `posts`
JOIN `groups`
    ON (`groups`.`id` = `posts`.`group_id`)
JOIN `users`
    ON (`users`.`id` = `posts`.`user_id`)
LEFT JOIN `events`
    ON (`events`.`id` = `posts`.`event_id`)
LEFT JOIN `docs`
    ON (`docs`.`post_id` = `posts`.`id`)
WHERE `posts`.`post_id` = 0
    AND `posts`.`group_id` = '28'
ORDER BY `posts`.`id` DESC
LIMIT 4
OFFSET 0

Этот запрос выбирает сообщения для текущей группы.Последнее, что мне нужно добавить, это то, что он выбирает документы (docs), которые относятся к этому сообщению ...

...
`docs`.`id` AS `attachment_id`
...
LEFT JOIN `docs`
    ON (`docs`.`post_id` = `posts`.`id`)
...

Мне понадобятся hashed_name и name из таблицы docs.На данный момент он выбирает только id, но это не самая большая проблема.Проблема в том, что с одним постом может быть связано более одного документа.

В этом случае в docs таблица id (первичные ключи) не совпадают, но post_id (поэтому егосвязанные с этим постом).На данный момент, если к сообщению имеется более одного вложения, я получаю записи 'n' ... так что мне нравятся повторяющиеся записи.Вот в чем проблема.

Цель состоит в том, чтобы после этого выполнить циклический проходной массив следующим образом:

<?php

    if(!empty($posts)) {

        foreach ($posts as $post) {
            echo $post['content'];

            foreach ($post['docs'] as $doc) {
                echo $doc['name'];
                echo $doc['hashed_name'];
            }
        }

    }

?>

Как изменить запрос, чтобы получить такой результат?Спасибо за совет!

Ответы [ 4 ]

1 голос
/ 20 июля 2011

Вы можете использовать старый запрос (и добавлять новые поля в качестве имени) и делать это через php

$posts=array();
$lastPostId=-1;
while($nextrow=mysql_fetch_assoc($query)){
    if($nextrow['id']!=$lastPostId){
        $posts[$nextrow['id']]=$nextrow;
        $posts[$nextrow['id']]['docs']=array();
        if(!is_null($nextrow['attachment_id']))
            $posts[$nextrow['id']]['docs']=array('id'=>$nextrow['attachment_id'] ,name => $nextrow['attach_name']...);
    }
    else{
        $posts[$nextrow['id']]['docs'][]=array('id'=>$nextrow['attachment_id'] ,name => $nextrow['attach_name']...);
    }
}
1 голос
/ 20 июля 2011

Вам необходимо реорганизовать массив.Вы всегда будете получать плоский результат, так что у вас фактически будут все события doc + post + ... вам нужно циклически просмотреть результат, а затем организовать их во вложенную структуру, какой бы вы не хотели, чтобы первичная запись была (вэто дело пост).

0 голосов
/ 20 июля 2011

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

article1|article1otherinfo|relateddoc1
article1|article1otherinfo|relateddoc2
article1|article1otherinfo|relateddoc3
article2|article2otherinfo|relateddoc4
article2|article2otherinfo|relateddoc5
article2|article2otherinfo|relateddoc6

или конкат с CONCAT ():

article1|article1otherinfo|relateddoc1,relateddoc2,relateddoc3
article2|article2otherinfo|relateddoc4,relateddoc5,relateddoc6

И взорвать для использования PHP какой-то особый характер, который вы использовали для объединения.

Или просто сделайте подзапрос для каждой статьи для связанных документов

0 голосов
/ 20 июля 2011

Вы можете использовать

SELECT ...
    GROUP_CONCAT(`docs`.`id`);
...
GROUP BY `posts`.`id`

, чтобы получить 1 запись на 1 сообщение со всеми идентификаторами, тогда explode

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