将两个SELECT语句合并到一个SQL中

时间:2019-09-03 17:39:57

标签: php mysql sql select

我会尽力使其更容易理解

我有两个表:

manager

要从表格帖子中获取所有信息,我使用了此方法:

posts
    id
    title
    descr
    body
    cat_id

cats
    id
    name

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

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

我想结合这两个查询,以便可以显示由cat_id插入的类别名称(例如,代替Sports我在显示类别的位置显示1)。

要显示我之后使用的帖子中的所有内容

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

当我使用此选项时,我无法仅显示类别名称cat_id。

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

2 个答案:

答案 0 :(得分:0)

无法执行您直接询问的事情。每个SELECT语句都是一个唯一查询,该查询返回数据库驱动程序的结果,您可以通过上述操作通过fetchAll()获得该结果。 (请注意,还有其他方法可以从PHP数据库中获取值,例如https://www.php.net/manual/en/pdostatement.fetch.php中所述的fetch()。如果您不需要一个大列表中的全部结果,则可以考虑使用使用该方法)

另一位评论者说的是正确的,您要做的是:

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

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

post

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

您发布的代码:

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

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

有效语法的示例为:

title

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

答案 1 :(得分:0)

回答您的查询。下面是我的SQL。 在下面的查询中,您可以从帖子和单列(即名称)中选择所有记录。

如果要具有所有列,请使用p。,c。进行编辑,或仅输入*。 因此它将为您获取所有列。 希望这能回答您的查询。如果没有,请进一步解释您的问题。

SELECT p.name,c.* FROM cats as c 
INNER JOIN posts as p ON cats.id = posts.cat_id;