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'];
}
}
}
?>
如何修改查询以获得该结果?谢谢你的建议!
答案 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进行连接。
或者只是对每篇文章进行子查询以获取相关文档