Php 选择要在主页中显示的所有帖子及其类别和标签

Php 选择要在主页中显示的所有帖子及其类别和标签,php,mysql,pdo,Php,Mysql,Pdo,我想选择要在主页中显示的所有帖子及其类别和标签,我还想在其他查询中选择单个帖子的所有类别和标签以显示在帖子页面上,目前我已经完成了,但我在foreach中使用了3个查询来获取所有数据,但我认为这是多余的,我想知道是否有可能在一个查询中获取所有数据,这是我的表的简化示例: 帖子 | id_post | title_post | created_at | +---------+---------------+---------------------+ | 1 |

我想选择要在主页中显示的所有帖子及其类别和标签,我还想在其他查询中选择单个帖子的所有类别和标签以显示在帖子页面上,目前我已经完成了,但我在foreach中使用了3个查询来获取所有数据,但我认为这是多余的,我想知道是否有可能在一个查询中获取所有数据,这是我的表的简化示例:

帖子

| id_post | title_post    | created_at          |
+---------+---------------+---------------------+
|       1 | Post Title  1 | 2019-11-26 06:40:03 |
|       2 | Post Title  2 | 2019-11-26 06:40:03 |
|       3 | Post Title  3 | 2019-11-26 06:40:03 |
+---------+---------------+---------------------+
+---------+-------------+
| post_id | category_id |
+---------+-------------+
|       1 |           1 |
|       1 |           2 |
|       1 |           3 |
|       2 |           2 |
|       3 |           1 |
|       3 |           3 |
+---------+-------------+
+--------+----------------+
| id_cat | title_category |
+--------+----------------+
|      1 | Cat Name 1     |
|      2 | Cat Name 2     |
|      3 | Cat Name 3     |
+--------+----------------+
+---------+-----------+
| post_id | tag_id    |
+---------+-----------+
|       1 |         1 |
|       1 |         2 |
|       1 |         3 |
|       2 |         4 |
|       2 |         5 |
|       2 |         6 |
|       3 |         6 |
+---------+-----------+
+--------+-------------+
| id_tag | tag_title   |
+--------+-------------+
|      1 | TagName1    |
|      2 | TagName2    |
|      3 | TagName3    |
|      4 | TagName4    |
|      5 | TagName5    |
|      6 | TagName6    |
+--------+-------------+

邮政分类

| id_post | title_post    | created_at          |
+---------+---------------+---------------------+
|       1 | Post Title  1 | 2019-11-26 06:40:03 |
|       2 | Post Title  2 | 2019-11-26 06:40:03 |
|       3 | Post Title  3 | 2019-11-26 06:40:03 |
+---------+---------------+---------------------+
+---------+-------------+
| post_id | category_id |
+---------+-------------+
|       1 |           1 |
|       1 |           2 |
|       1 |           3 |
|       2 |           2 |
|       3 |           1 |
|       3 |           3 |
+---------+-------------+
+--------+----------------+
| id_cat | title_category |
+--------+----------------+
|      1 | Cat Name 1     |
|      2 | Cat Name 2     |
|      3 | Cat Name 3     |
+--------+----------------+
+---------+-----------+
| post_id | tag_id    |
+---------+-----------+
|       1 |         1 |
|       1 |         2 |
|       1 |         3 |
|       2 |         4 |
|       2 |         5 |
|       2 |         6 |
|       3 |         6 |
+---------+-----------+
+--------+-------------+
| id_tag | tag_title   |
+--------+-------------+
|      1 | TagName1    |
|      2 | TagName2    |
|      3 | TagName3    |
|      4 | TagName4    |
|      5 | TagName5    |
|      6 | TagName6    |
+--------+-------------+
类别

| id_post | title_post    | created_at          |
+---------+---------------+---------------------+
|       1 | Post Title  1 | 2019-11-26 06:40:03 |
|       2 | Post Title  2 | 2019-11-26 06:40:03 |
|       3 | Post Title  3 | 2019-11-26 06:40:03 |
+---------+---------------+---------------------+
+---------+-------------+
| post_id | category_id |
+---------+-------------+
|       1 |           1 |
|       1 |           2 |
|       1 |           3 |
|       2 |           2 |
|       3 |           1 |
|       3 |           3 |
+---------+-------------+
+--------+----------------+
| id_cat | title_category |
+--------+----------------+
|      1 | Cat Name 1     |
|      2 | Cat Name 2     |
|      3 | Cat Name 3     |
+--------+----------------+
+---------+-----------+
| post_id | tag_id    |
+---------+-----------+
|       1 |         1 |
|       1 |         2 |
|       1 |         3 |
|       2 |         4 |
|       2 |         5 |
|       2 |         6 |
|       3 |         6 |
+---------+-----------+
+--------+-------------+
| id_tag | tag_title   |
+--------+-------------+
|      1 | TagName1    |
|      2 | TagName2    |
|      3 | TagName3    |
|      4 | TagName4    |
|      5 | TagName5    |
|      6 | TagName6    |
+--------+-------------+
POST_标签

| id_post | title_post    | created_at          |
+---------+---------------+---------------------+
|       1 | Post Title  1 | 2019-11-26 06:40:03 |
|       2 | Post Title  2 | 2019-11-26 06:40:03 |
|       3 | Post Title  3 | 2019-11-26 06:40:03 |
+---------+---------------+---------------------+
+---------+-------------+
| post_id | category_id |
+---------+-------------+
|       1 |           1 |
|       1 |           2 |
|       1 |           3 |
|       2 |           2 |
|       3 |           1 |
|       3 |           3 |
+---------+-------------+
+--------+----------------+
| id_cat | title_category |
+--------+----------------+
|      1 | Cat Name 1     |
|      2 | Cat Name 2     |
|      3 | Cat Name 3     |
+--------+----------------+
+---------+-----------+
| post_id | tag_id    |
+---------+-----------+
|       1 |         1 |
|       1 |         2 |
|       1 |         3 |
|       2 |         4 |
|       2 |         5 |
|       2 |         6 |
|       3 |         6 |
+---------+-----------+
+--------+-------------+
| id_tag | tag_title   |
+--------+-------------+
|      1 | TagName1    |
|      2 | TagName2    |
|      3 | TagName3    |
|      4 | TagName4    |
|      5 | TagName5    |
|      6 | TagName6    |
+--------+-------------+
标签

| id_post | title_post    | created_at          |
+---------+---------------+---------------------+
|       1 | Post Title  1 | 2019-11-26 06:40:03 |
|       2 | Post Title  2 | 2019-11-26 06:40:03 |
|       3 | Post Title  3 | 2019-11-26 06:40:03 |
+---------+---------------+---------------------+
+---------+-------------+
| post_id | category_id |
+---------+-------------+
|       1 |           1 |
|       1 |           2 |
|       1 |           3 |
|       2 |           2 |
|       3 |           1 |
|       3 |           3 |
+---------+-------------+
+--------+----------------+
| id_cat | title_category |
+--------+----------------+
|      1 | Cat Name 1     |
|      2 | Cat Name 2     |
|      3 | Cat Name 3     |
+--------+----------------+
+---------+-----------+
| post_id | tag_id    |
+---------+-----------+
|       1 |         1 |
|       1 |         2 |
|       1 |         3 |
|       2 |         4 |
|       2 |         5 |
|       2 |         6 |
|       3 |         6 |
+---------+-----------+
+--------+-------------+
| id_tag | tag_title   |
+--------+-------------+
|      1 | TagName1    |
|      2 | TagName2    |
|      3 | TagName3    |
|      4 | TagName4    |
|      5 | TagName5    |
|      6 | TagName6    |
+--------+-------------+
因此,要在主页中显示,我使用以下命令:

$sql = "SELECT * FROM posts WHERE active_post = 1 ORDER BY id_post $mode LIMIT $base, $max";

 <?php foreach ($posts as $key => $value) : ?>
  <article class="col-12 post">
    <div class="post__header py-4 px-0">
      <h2 class="font-weight-bold post__title">
        <a href="<?php echo $blog['domain'] . $value['url_post'] ?>"><?php echo $value['title_post'] ?></a>
      </h2>
      <div class="post__info">
        <ul class="mb-0 text-muted">
          <li>
            <span class="text-muted">
              <i class="far fa-calendar-alt icon"></i>
              <?php echo $value['created_at'] ?>
            </span>
          </li>
          <li>
            <span class="text-muted">
              <i class="far fa-folder icon"></i>
            </span>
            <?php

              $cat = BlogController::getCategories($value['id_post']);
              $c = '';
              if (!empty($cat)) {
                foreach ($cat as $k => $val) {
                  $c .= '<a class="text-muted" href="' . $blog['domain'] . 'category/' . $val["url_category"] . '">' . $val["title_category"] . '</a>, ';
                }
                echo substr($c, 0, -2);
              } else {
                echo '<a class="text-muted" href="not-category">Not Category</a>';
              }
              ?>
          </li>
          <li>
            <?php
              $tags = BlogController::getTags(null, $value['id_post']);
              $t = '';
              if (!empty($tags)) {
                foreach ($tags as $key => $val) {
                  $t .= '<a class="text-muted" href="' . $blog['domain'] . 'tags/' . $val["url_tags"] . '">' . $val["title_tag"] . '</a>, ';
                }
                echo '<span class="text-muted">
                        <i class="fas fa-hashtag icon"></i>
                      </span>';
                echo substr($t, 0, -2);
              }
              ?>
          </li>
        </ul>
      </div>
    </div>
    <figure class="mb-0">
      <img src="<?php echo $blog['domain'] . substr($value['img_post'], 22); ?>" alt="<?php echo $value['title_post'] ?>" class="img-fluid post__image" loading="lazy" />
    </figure>
    <div class="post__body">
      <p class="post__text">
        <?php echo $value['desc_post'] ?>
      </p>
      <a href="<?php echo  $blog['domain'] . $value['url_post'] ?>" class="post__link color-link">Read more... <span>→</span></a>
    </div>
  </article>
<?php endforeach; ?>
因此,我想进行一次查询以获取所有信息,我尝试这样做:

$sql = "SELECT p.id_post, p.title_post, p.created_at, cat.title_category, tag.title_tag FROM posts as p INNER JOIN post_categories AS pc INNER JOIN categories AS cat INNER JOIN tags as tag INNER JOIN post_tags AS pt ON pc.post_id = p.id_post WHERE pc.category_id = cat.id_cat AND pt.post_id = tag.id_tag LIMIT 0, 10";
以下是结果(仅针对不打印大数据,结果限制为10):

你可以从我的主页上看到一个截图,如果有人能帮我做到这一点,我非常感谢


这就是我想要的:

+---------+--------------+---------------------+------------------------------------+-----------------------------+
| id_post | title_post   | created_at          | title_categories                   | title_tags                  |
+---------+--------------+---------------------+------------------------------------+-----------------------------+
| 1       | Post title 1 | 2019-12-05 05:44:47 | Cat Name 1, Cat Name 2, Cat Name 3 | TagName1, TagName2,TagName3 |
+---------+--------------+---------------------+------------------------------------+-----------------------------+
| 2       | Post title 2 | 2019-12-05 05:44:47 | Cat Name 1, Cat Name 2             | TagName4                    |
+---------+--------------+---------------------+------------------------------------+-----------------------------+
| 3       | Post title 3 | 2019-12-05 05:44:47 | Cat Name 1                         | TagName3, TagName5,TagName6 |
+---------+--------------+---------------------+------------------------------------+-----------------------------+

提前感谢

这里有一个用于您目的的查询,它通过加入5个表来工作

select 
    p.id_post,
    p.title_post,
    p.created_at,
    group_concat(distinct c.title_category order by c.title_category) title_category,
    group_concat(distinct t.tag_title order by t.tag_title) tag_title 
from posts p
inner join post_categories pc on pc.post_id = p.id_post
inner join categories c on c.id_cat = pc.category_id
inner join post_tags pt on pt.post_id = p.id_post
inner join tags t on t.id_tag = pt.tag_id
group by
    p.id_post,
    p.title_post,
    p.created_at
order by ??
limit 10

注意:要使
limit
子句有意义,您需要定义
orderby
标准。我在查询中添加了该子句,但带有问号,请将其替换为相关的列名。

以下是用于您目的的查询,它通过连接起作用的5个表来工作

select 
    p.id_post,
    p.title_post,
    p.created_at,
    group_concat(distinct c.title_category order by c.title_category) title_category,
    group_concat(distinct t.tag_title order by t.tag_title) tag_title 
from posts p
inner join post_categories pc on pc.post_id = p.id_post
inner join categories c on c.id_cat = pc.category_id
inner join post_tags pt on pt.post_id = p.id_post
inner join tags t on t.id_tag = pt.tag_id
group by
    p.id_post,
    p.title_post,
    p.created_at
order by ??
limit 10

注意:要使
limit
子句有意义,您需要定义
orderby
标准。我在查询中添加了该子句,但带有问号,请将其替换为相关列名。

不起作用,请选择p.id\u post、p.title\u post、p.created\u at、c.title\u category、,t.title_tags from posts p internal join post_categories pc on pc.post_id=p.id_post internal join categories c on c.id_categories=pc.category_id internal join post_tags pt on pt.post_id=p.id_post internal join tags t t t t t on t.id_tag=pt.tag_id按p.id_post限制10排序;这就是我想要得到的:事实上,这是我期待的工作,非常感谢,这里是我的单帖查询
选择p.id\u post,p.title\u post,p.created\u at,GROUP\u CONCAT(不同的c.title\u分类顺序按c.title\u分类)title\u分类,GROUP\u CONCAT(不同的t.title\u标签顺序按t.title\u标签)title_tags FROM posts p INNER JOIN post_categories pc ON pc.post_id=p.id_post INNER JOIN categories c ON c.id_category=pc.category_id INNER JOIN post_tags pt ON pt.post_id=p.id_post=1 GROUP BY p.id_post,p.title_post,p.created_at不工作,选择p.id\u post,p.title\u post,p.created\u at,c.title\u category,t.title\u tags from posts p inner join post\u categories pc on pc.post\u id=p.id\u post inner join categories c on c.id\u categories=pc.categories\u id\u id内部join post pt on pt on pt on pt.post\u id\u tags t t t t t t t t on t.id\u tags=pt.id\u id\t按p.id\u post的顺序限制10;这就是我想要得到的:事实上,这是我期待的工作,非常感谢,这里是我的单帖查询
选择p.id\u post,p.title\u post,p.created\u at,GROUP\u CONCAT(不同的c.title\u分类顺序按c.title\u分类)title\u分类,GROUP\u CONCAT(不同的t.title\u标签顺序按t.title\u标签)title_tags FROM posts p INNER JOIN post_categories pc ON pc.post_id=p.id_post INNER JOIN categories c ON c.id_category=pc.category_id INNER JOIN post_tags pt ON pt.post_id=p.id_post=1 GROUP BY p.id_post,p.title_post,p.created_at我们实际上不做截图。请看:很抱歉,我只是删除了屏幕截图,并按照您给我的指南添加了文本表,谢天谢地,这并不是指南所说的。我们实际上不做屏幕截图。请看:很抱歉,我只是删除了屏幕截图,并根据您给我的指南添加了文本表,谢天谢地,这与指南所说的并不完全一致。