PHP / SQL检索两个类别和最新主题

时间:2017-05-09 09:55:22

标签: php mysql

我目前正在练习"建立一个论坛。我以前从来没有做过这么大的事,而且它已经持续了一段时间。几乎一切都有效,但我无法从索引页面上的类别中选择正确的最新主题。

这是SQL:

    $sql = '
    SELECT topic_id, topic_subject, topic_by FROM topics WHERE topic_cat IN (1,2,3) ORDER BY topic_cat DESC LIMIT 3
    UNION
    SELECT cat_id, cat_name, cat_description FROM categories WHERE cat_id IN (1,2,3)
    ';

我还将从数据库中提供这两张表的一些图片。 这是类别表。 CATEGORIES

这是主题表。

TOPICS

从SQL中可以看出,这里的基本思想是选择三个第一类,然后从这三个类别中选择最新的主题。

将sql检索的信息放入包含所有内容的表中的代码。

    $result = mysqli_query($conn, $sql);

    if (!$result) {
        echo 'Could not display categories. Error: ' . mysqli_error($conn);
    } else {
        if (mysqli_num_rows($result) == 0) {
            echo 'No categories found in the database.';
        } else {
            echo '
                <table>
                <h3>Top 3 Categories</h3>
                <tr>
                    <th>Category</th>
                    <th>Latest Topic</th>
                </tr>
            ';

            while ($row = mysqli_fetch_assoc($result)) {
                echo '<tr>
                    <td class="leftpart">
                        <h3><a href="category.php?id=' . $row['cat_id'] . '">' . $row['cat_name'] . '</a></h3>' . $row['cat_description'] . '
                    </td>
                    <td class="rightpart">
                        <a href="topic.php?id=' . $row['topic_id'] . '">' . $row['topic_subject'] . '</a>
                    </td>
                </tr>
                ';
            }

            echo '</table>';
        }
    }

我不确定还有什么要添加到此,所以如果有任何问题,请对其进行评论,我可以在那里回答或在主帖上添加其他信息!

2 个答案:

答案 0 :(得分:2)

您实际需要的是JOIN,它基本上用于根据两个或多个表之间的相关列组合来自两个或多个表的行。

以下是SQL中不同类型的JOIN:

  • (INNER)JOIN:返回两者中具有匹配值的记录 表
  • LEFT(OUTER)JOIN:返回左表中的所有记录,以及 来自右表的匹配记录
  • RIGHT(OUTER)JOIN:从右表中返回所有记录,然后返回 来自左表的匹配记录
  • FULL(OUTER)JOIN:当两者中都匹配时返回所有记录 左表或右表

这就是你想要的:

SELECT
    topics.topic_id,
    topics.topic_subject,
    categories.cat_id,
    categories.cat_name,
    categories.cat_description 
FROM
    topics 
    JOIN
        categories 
        ON topics.topic_cat = categories.cat_id 
ORDER BY
    topics.topic_date DESC LIMIT 3;

你没有得到工会的正确结果的原因在这里看看:

UNION运算符用于组合两个或多个SELECT语句的结果集。

  • UNION中的每个SELECT语句必须具有相同的编号 列
  • 列也必须具有类似的数据类型
  • 每个SELECT语句中的列也必须采用相同的顺序

您的桌子不符合上述创意

答案 1 :(得分:0)

试试这个:

select * from topics inner join categories 
 on topics.topic_cat = categories.cat_id
order by topics.topic_date desc limit 3

基本上,内部联接会执行此操作。如果需要,您可以选择特定字段而不是*。