我会尽力让它更容易理解
我有两个表:
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 中的数据库获取值,例如 fetch()
如 https://www.php.net/manual/en/pdostatement.fetch.php 中所述。如果您不需要一个大列表中的整组结果,您可以考虑使用该方法)
其他评论者说的是正确的,你想做的是:
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 ... ?>
之外堵塞。如果它位于这些 block 之一的内部,您将嵌套 PHP block ,例如: <?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? )
关于php - 两个 SELECT 语句合并为一个 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57776454/