首页 > 解决方案 > 两个 SELECT 语句到一个 SQL 中

问题描述

我会尽量让它更容易理解

我有两张桌子:

posts
    id
    title
    descr
    body
    cat_id

cats
    id
    name

为了从表格帖子中获取所有内容,我使用了这个:

sql = "SELECT * FROM posts ORDER BY id"; 
$query = $db->prepare($sql);
$query->execute();
$posts = $query->fetchAll(); 

现在从我使用的 cat_id 获取每个帖子的类别名称

'SELECT c.name FROM cats c INNER JOIN posts p ON c.id = p.cat_id ORDER BY p.id DESC';

我想组合这两个查询,这样我就可以显示 cat_id 的类别名称(例如,我得到 1 而不是 Sports 应该显示类别的位置)。

之后显示帖子中的所有内容,例如

    foreach($posts as $post):
 <?php echo $post['title']; ?> 

当我使用它时,我不能只显示类别名称 cat_id。

我尝试了 UNION 并尝试进行两个查询,但无法在 foreach 中使用 foreach 我得到错误。

标签: phpmysqlsqlselect

解决方案


没有办法做你直接要求的事情。每条SELECT语句都是一个唯一的查询,它从数据库驱动程序返回结果,您将通过fetchAll()上面编写的方式获得这些结果。(请注意,还有其他方法可以从 PHP 中的数据库中获取值,例如https://www.php.net/manual/en/pdostatement.fetch.phpfetch()中所述。如果您不需要整个集合一个大列表中的结果,您可能会考虑使用该方法)

其他评论者说的是正确的,您要做的是:

SELECT c.title
FROM cats c
INNER JOIN posts p ON c.id = p.cat_id
ORDER BY p.id DESC

这将为您提供所有cats具有关联的名称post。您可以通过以下方式使用它:

<?php
$sql = "see above SELECT";
$query = $db->prepare($sql);
$query->execute();
$categoryTitles = $query->fetchAll();
foreach ($categoryTitles as $title) {
    echo $title['title'];
}

(请注意,该示例将向浏览器输出一大块文本,您需要将其集成到您自己的 HTML 生成代码中)

您发布的代码:

    foreach($posts as $post):
 <?php echo $post['title']; ?> 

看起来不像完全有效的 PHP。foreach看起来它在一个街区<?php ... ?>之外。如果它位于其中一个块中,您将嵌套 PHP 块,例如:<?php foreach($posts as $post) { <?php echo $post['title']; ?> } ?>我认为这不是有效的语法。另外,您在:后面加上一个foreach我也不确定它是否有效的语法。您的示例代码还name从数据库中选择列,而不是title您尝试在 PHP 代码中检索的列。

有效语法的一个例子是:

<?php
// all the PDO code
?>
<!-- some HTML -->
<?php foreach ($posts as $post) { ?>
  <div> some more HTML </div>
  <? echo $post['title']; ?>
<?php } ?>

执行您所询问的另一种方法是将您的 SQL 代码转换为存储过程,但这对于您当前的用例来说可能太复杂了。(如果您想了解有关 MySQL 中存储过程的更多信息,请查看以下 Stack Overflow 答案:Beginners'guide to stored procedures with MySQL?


推荐阅读