php - 两个 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 我得到错误。
解决方案
没有办法做你直接要求的事情。每条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?)
推荐阅读
- function - MATLAB PDE Modeler 区域和状态
- android - 为什么 Android Studio dsplay 提示 MutableState
作为部分? - mongodb - 比较两个集合与一个字段 Mongodb
- .net-core - 有没有办法将 PackageReference 更新为 Directory.Build.targets 中的某个最低版本?
- c - 链接内核时对 isr0 到 isr9 的未定义引用
- docker - 如何在 centos 容器中运行一些剪切命令?
- android - 如何使用retrofit2/rxjava2返回或使用列表作为多个请求的响应?
- stargazer - 删除 Stargazer Summary Stat 中的“Statistics”标题
- python - 试图在列表中获取总和以打印输出中的字符串
- android - FlutterFirebaseCorePlugin.java 使用或覆盖已弃用的 API?