【问题标题】:MySQL select query with sub-select as column以子选择为列的 MySQL 选择查询
【发布时间】:2017-08-04 18:47:58
【问题描述】:

我目前正在使用以下 PHP 代码:

$pages = $Database->query("SELECT page_id FROM pages WHERE page_parent = '0'");
$pages = $pages->fetchAll(PDO::FETCH_ASSOC);
foreach ($pages as $page_key => $page) {
    $pages[$page_key]['page_children'] = $Database->prepare("SELECT page_id FROM pages WHERE page_parent = :id");
    $pages[$page_key]['page_children']->execute(array(
        ':id' => $page['page_id']
    ));
    $pages[$page_key]['page_children'] = $pages[$page_key]['page_children']->fetchAll(PDO::FETCH_ASSOC);
}
echo '<pre>';
print_r($pages);
die();

不过,它在做什么应该是相当明显的:

  1. 选择所有没有父级的“页面”记录 (page_parent = 0)
  2. 在步骤 1 中选择所有父母的孩子的“页面”记录

有没有办法把它组合成一条 SQL 语句?

更新以显示所需的输出:

Array
(
    [0] => Array
        (
            [page_id] => 1
            [page_children] => Array
                (
                    [0] => Array
                        (
                            [page_id] => 2
                        )

                    [1] => Array
                        (
                            [page_id] => 3
                        )

                )

        )

)

【问题讨论】:

标签: php mysql


【解决方案1】:

你可以使用 INNER JOIN

  SELECT a.* 
  FROM pages a
  INNER JOIN pages b on a.page_parent = b.page_id 
  where b.parent_page ='0';

如果你还想要没有孩子的父母,你可以使用左联接

  SELECT a.* 
  FROM pages a
  LEFT JOIN pages b on a.page_parent = b.page_id and  b.parent_page ='0';

或者你可以使用联合

  SELECT a.* 
  FROM pages a
  INNER JOIN pages b on a.page_parent = b.page_id 
  where b.parent_page ='0'
  union all
  SELECT *
  FROM pages 
  WHERE page_parent = '0'

【讨论】:

  • 我之前已经尝试过,它返回孩子 - 但不返回父母。
  • 你也需要父母吗?
  • 您的两个答案似乎都产生了相同的输出。在我的示例代码中,$pages 是一个数组 - $pages 数组(我将其称为 $page)中的每个项目也是一个数组(其中包含父信息,page_children 键包含子项)。
  • 我已经用一个正确输出应该是什么的例子更新了我的答案。
  • 答案已更新..(删除左连接可以操作的位置)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-19
  • 2015-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多