Php 按顺序选择活动数据
我有两个表Php 按顺序选择活动数据,php,mysql,sql,mysqli,pdo,Php,Mysql,Sql,Mysqli,Pdo,我有两个表posts和categories,两个表之间有一对多的关系 以下是两张表格: posts table _________________________________________________________________ | id | title | content | category_id | post_order | post_active |
posts
和categories
,两个表之间有一对多的关系
以下是两张表格:
posts table
_________________________________________________________________
| id | title | content | category_id | post_order | post_active |
|____|_______|_________|_____________|_____________|_____________|
| 1 | test1 | testing | 1 | 0 | 1 |
| 2 | test2 | testing | 1 | 1 | 1 |
| 3 | test3 | testing | 2 | 2 | 0 |
| . | ..... | ....... | . | . | . |
|____|_______|_________|_____________|_____________|_____________|
categories table
_____________________________________
| c_id | c_name | c_order | c_active |
|______|________|_________|__________|
| 1 | cat1 | 0 | 1 |
| 2 | cat2 | 1 | 1 |
| 3 | cat3 | 2 | 0 |
| . | ..... | ....... | . |
|______|________|_________|__________|
category\u id
和c\u id
之间存在关系,因此posts
表中的category\u id
指的是category idc\u id
post\u-order
和c\u-order
用于对post
和类别进行排序
而post_active
和c_active
用于定义它是否会显示给用户,1
表示是,而0
表示否
我显示了类别
,并且帖子
在它们下面,如下所示:
________________________________________
| | | |
| cat1 | cat2 | cat3 |
| (active) |__________|__________|
| |
| |
| test1 |
| testing |
| |
| test2 |
| testing |
|_______________________________________|
显示数据的代码:
//That query should get the active categories and posts ordered by the order column, Not sure if it's correct.
$results = $conn->prepare("SELECT * FROM categories LEFT JOIN categories ON categories.c_id = posts.id WHERE categories.c_active = '1' and posts.post_active = '1' order by categories.c_order, posts.post_order ASC");
//Execute the previous query.
$results->execute();
while ($row = $results->fetch(PDO::FETCH_ASSOC)) {
$categories[$row['category_name']][] = $row;
}
//Print the categories
foreach (array_keys($categories) as $category_name) {
echo $category_name;
}
//Print the posts
foreach ($categories as $category_name => $posts) {
foreach ($posts as $post) {
echo $post['title'];
}
}
在前面的PHP代码中有HTML代码,用于为每篇文章创建选项卡和手风琴,如果这有帮助,下面是完整的代码:
<!-- Nav tabs -->
<ul class="nav nav-tabs" role="tablist">
<?php foreach (array_keys($categories) as $category_name) { ?>
<li role="presentation"><a href="#<?php echo str_replace(' ', '', $category_name); ?>" aria-controls="<?php echo str_replace(' ', '', $category_name); ?>" role="tab" data-toggle="tab"><?php echo $category_name; ?></a></li>
<?php } ?>
</ul> <!-- .nav-tabs -->
<!-- Tab panes -->
<div class="tab-content">
<?php foreach ($categories as $category_name => $posts) { ?>
<div role="tabpanel" class="tab-pane fade" id="<?php echo str_replace(' ', '', $category_name); ?>">
<div class="panel-group" id="accordion" role="tablist" aria-multiselectable="true">
<?php foreach ($posts as $post) { ?>
<div class="panel panel-default">
<div class="panel-heading" role="tab" id="headingOne">
<h4 class="panel-title">
<a role="button" class="collapsed" data-toggle="collapse" data-parent="#accordion" href="#<?php echo $post['id']; ?>_faq" aria-expanded="false" aria-controls="#<?php echo $post['id']; ?>_faq">
<?php echo $post['title'] ?>
</a>
</h4>
</div>
<div id="<?php echo $post['id']; ?>_faq" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingOne">
<div class="panel-body">
<?php echo $post['content']; ?>
</div> <!-- .panel-body -->
</div> <!-- .panel-collapse -->
</div> <!-- .panel-default -->
<?php } ?>
</div> <!-- .panel-group -->
</div> <!-- .tab-pane -->
<?php } ?>
</div> <!-- .tab-content -->
我应该获取所有活动的类别
和帖子
,但我只获取第一个活动类别及其已排序的帖子。您的查询必须如下所示:
SELECT * FROM `posts` `p`
LEFT JOIN `categories` `c` ON `c`.`c_id` = `p`.`category_id`
WHERE `c`.`c_active` = '1'
and `p`.`post_active` = '1'
order by `p`.`post_order`, `c`.`c_order`
**然后执行查询并放入数组**
$myArr = array();
foreach($youQuery as $key => $val){
$myArr[$val->c_id]['c_id '] = $val->c_id;
$myArr[$val->c_id]['c_name '] = $val->c_name;
$myArr[$val->c_id]['post '][$val->id]['id] = $val->id;
$myArr[$val->c_id]['post '][$val->title ]['title ] = $val->title ;
$i++;
}
然后您可以根据需要循环数组。您的查询必须如下所示:
SELECT * FROM `posts` `p`
LEFT JOIN `categories` `c` ON `c`.`c_id` = `p`.`category_id`
WHERE `c`.`c_active` = '1'
and `p`.`post_active` = '1'
order by `p`.`post_order`, `c`.`c_order`
**然后执行查询并放入数组**
$myArr = array();
foreach($youQuery as $key => $val){
$myArr[$val->c_id]['c_id '] = $val->c_id;
$myArr[$val->c_id]['c_name '] = $val->c_name;
$myArr[$val->c_id]['post '][$val->id]['id] = $val->id;
$myArr[$val->c_id]['post '][$val->title ]['title ] = $val->title ;
$i++;
}
然后您可以根据需要循环数组。我建议您使用以下查询:
SELECT b.c_name, a.id, TRIM(a.title) AS title, a.content
FROM posts a
INNER JOIN categories b ON a.category_id = b.c_id
WHERE a.post_active = '1' AND b.c_active = '1'
ORDER BY b.c_order, a.post_order
- 与其要求php修改标题,不如在查询中进行修改
- 我使用的是
内部联接
,因为我希望帖子中的所有行
在类别中都有相应的行
- 按
c_顺序
排序,然后按post_顺序
排序,以便在迭代结果集时将分类条目分组在一起
根据我的演示:
并引用fetchAll
您的类别位于数组\u键($resultset)
中
您可以迭代准备好的结果集并访问第一级键和子数组行以显示数据。我建议您使用以下查询:
SELECT b.c_name, a.id, TRIM(a.title) AS title, a.content
FROM posts a
INNER JOIN categories b ON a.category_id = b.c_id
WHERE a.post_active = '1' AND b.c_active = '1'
ORDER BY b.c_order, a.post_order
- 与其要求php修改标题,不如在查询中进行修改
- 我使用的是
内部联接
,因为我希望帖子中的所有行
在类别中都有相应的行
- 按
c_顺序
排序,然后按post_顺序
排序,以便在迭代结果集时将分类条目分组在一起
根据我的演示:
并引用fetchAll
您的类别位于数组\u键($resultset)
中
您可以迭代准备好的结果集并访问第一级键和子数组行以显示数据。您确定您的查询是更新的查询吗?您的查询看起来错误:SELECT*FROM categories LEFT JOIN categories ON categories.c_id=posts.id
应该是SELECT*FROM categories LEFT JOIN posts ON categories ON categories ONcategories.c_id=posts.categories_id
这是现在的查询SELECT*FROM categories LEFT JOIN posts ON c_id=posts.categories_id其中categories_active=1和posts.post_active=1按类别和posts排序。post_ORDER ASC
但我仍然只得到一个类别:在ORDER BY
中替换和带有,
;不需要ASC
。你能为我们制作一个dbfiddle.com演示,让我们玩吗?当问题已准备就绪并准备好进行编码时,提供支持总是比较简单。您确定您的查询是更新的吗?您的查询看起来错误:SELECT*FROM categories LEFT JOIN categories on categories.c_id=posts.id
应该是SELECT*FROM categories LEFT JOIN posts on categories.c_id=posts.category\u id
这是现在的查询从类别左侧选择*在c\u id=posts.category\u id上加入帖子,其中category\u active=1和posts.post\u active=1按类别和帖子排序。post\u ORDER ASC
但我仍然只得到一个类别:在按顺序替换和为,
;不需要ASC
。你能为我们制作一个dbfiddle.com演示,让我们玩吗?当问题已准备就绪并准备好编写代码时,提供支持总是比较简单。您拼写错误了foreach
。为什么要声明$i
或$key
?为了记录在案,这些倒勾都不是必需的。键中的空格和缺少的单引号破坏了你的代码片段。只要删除你认为错误的内容,我就给你举个例子。不,谢谢。我允许你整理你自己的帖子。你拼写错了foreach
。为什么要声明$i
或$key
?为了记录在案,这些倒勾都不是必需的。键中的空格和缺少的单引号破坏了你的代码片段。只要删除你认为错误的内容,我就给你举个例子。不,谢谢。我允许你整理你自己的帖子。谢谢你,这和往常一样工作顺利,代码变成了$results->execute()$结果=$results->fetchAll(PDO::FETCH_组);foreach(array_keys($results)as$category_name){echo$category_name;}foreach($category_name=>$posts){foreach($posts as$post){echo$post['title'];}
感谢这一切正常运行,代码变成了$results->execute()$结果=$results->fetchAll(PDO::FETCH_组);foreach(数组_键($results)作为$category_name){echo$category_name;}foreach($category_name=>$posts){foreach($posts作为$post){echo$post['title'];}}