一个帖子不止一个文件......任何想法?

时间:2011-07-20 08:54:00

标签: php sql arrays join

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表的namedocs。目前,它只选择id,但这不是最大的问题。问题是,一篇文章可能有更多与之相关的文档。

在这种情况下,docsid(主键)不一样,但是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 个答案:

答案 0 :(得分:1)

您需要重新组织数组。你总是会得到一个平坦的结果,所以你实际上每个doc + post +事件......你需要循环遍历结果,然后根据你想要的主要记录将它们组织成一个嵌套结构(在这个案子的帖子)。

答案 1 :(得分:1)

您可以使用旧查询(并添加新字段作为名称)并通过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']...);
    }
}

答案 2 :(得分:0)

您可以使用

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

获得1个帖子,其中包含所有ID,然后是explode

答案 3 :(得分:0)

您无法将several行推入查询的某些行。您可以尝试以提供的方式加入它:

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

并使用一些特殊的charactar来使用PHP进行连接。

或者只是对每篇文章进行子查询以获取相关文档