php - 在 PDO 中将 1 行连接到多行

标签 php sql join pdo left-join

这是我的场景:

Database Name: Children
+-------------+---------+---------+
| child_id   | name      | user_id |
+-------------+---------+---------+

    1           Beyonce     33
    2           Cher        33
    3           Madonna     33
    4           Eminem      33


Database Name: Parents
+-------------+---------+---------+
| parent_id   | child_id   | parent_name |
+-------------+---------+---------+

    1           1           Obama
    2           1           Michelle
    3           4           50cents
    4           4           Gaga


Desired Output:
+-------------+---------+---------+
| child_id   | name      | parent Name |
+-------------+---------+---------+
    1           Beyonce     Obama (Row 1) Michelle (Row 2)

PDO 中的 PHP SQL 查询:

$sql = "SELECT  Children.child_id, Children.name, Parents.parent_name
        FROM Children               
        LEFT JOIN Parents
            ON Children.child_id = Parents.child_id
        WHERE Children.user_id = ?
        ";

$stmt = $db_PDO->prepare($sql); 

if($stmt->execute(array($userId))) // $userId defined earlier
{
        // Loop through the returned results
        $i = 0;

        foreach ($stmt as $row) {
            $fetchArray[$i] = array (
                'childId' => $row['child_id'],
                'childName' => $row['name'],    
                'parentName' => $row['parent_name'],    
                // How do I save the multiple parents from other rows here ????
                );                  
            $i++;
        }             
}

如何运行将 1 行连接到 PDO 中第二个表中的多行的查询?我在这里读过其他主题,但我不确定。添加第二个查询来在循环中分别获取每个 child_id 的链接父项是否更容易?我担心查询会太多。有人可以帮我解决这个问题吗?

最佳答案

好吧,我花了一些时间来测试它,但是现在你开始了。 不幸的是,人们无法轻松地在 mysql 中透视表,但还有其他选择。

http://sqlfiddle.com/#!9/1228f/26

SELECT GROUP_CONCAT(
  CONCAT_WS(':', Parents.parent_id,Parents.parent_name) ) FROM Parents where Parents.child_id=1

;
SELECT
  Children.child_id,
  Children.name,
  GROUP_CONCAT(
  CONCAT_WS(':', Parents.parent_id,Parents.parent_name)    ) as parents
FROM
  Children
  LEFT JOIN Parents
        ON Children.child_id = Parents.child_id
        WHERE Children.user_id = 33
  Group by Children.child_id

此查询使用组 concat 将我们想要的所有结果连接到一个冒号分隔的字符串中,其中包含我们想要的值,并在各个字段之间使用逗号。

我们可以做一些棘手的魔术来使它们成为单独的字段,但这会破坏我们的 php,因为我们不知道每个查询将返回多少字段(收养、孤儿、未知 parent 等......)

在 php 中,你可以将它们提供给一个对象

$parents = array();
$loop1 = explode(',',$row['parents']);
    foreach($loop1 as $parentset) {
        $parentdetail = explode(":",$parentset);// decide yourself how much detail you want in here... I jsut went with name and id.
        $parent = new stdClass();
        $parent->id = $parentdetail[0];
        $parent->name = $parentdetail[1];
        array_push($parents,$parent);
    }

var_dump($parents);

关于php - 在 PDO 中将 1 行连接到多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29460195/

相关文章:

php - 带有方法 get 的 Laravel 路由表单

javascript - 使用 ajax 和 jquery 验证提交值

mysql - SQL Join 用于检索单个用户的记录

javascript - 如何使用正则表达式将文本样式更改为特定模式?

php - 如何减少从连续数字中找到第 n 个位置的时间少于 1 秒

php - 如何使用 PHP 将 SQL Server 表中新添加的行传输到相同的 MySQL 表?

sql - 在嵌套选择中求和

具有动态生成列和聚合函数的 SQL Pivot

sql - 根据临时列加入

sql - 在 oracle 的 join select 查询中将某些列名称别名为一个字段