PHP SQL Join 查询合并多数组中的内容

Posted

技术标签:

【中文标题】PHP SQL Join 查询合并多数组中的内容【英文标题】:PHP SQL Join Query merge content in Multi-Array 【发布时间】:2018-08-13 06:53:30 【问题描述】:

我遇到了一个 SQL 查询问题,我想继续使用 php。 这是我的数据库的结构:

表格:部分

+------------+---------------+-----------------+--+--+
| section_id | section_titel | section_text    |  |  |
+------------+---------------+-----------------+--+--+
| 1          | Section One   | Test text blaaa |  |  |
+------------+---------------+-----------------+--+--+
| 2          | Section Two   | Test            |  |  |
+------------+---------------+-----------------+--+--+
| 3          | Section Three | Test            |  |  |
+------------+---------------+-----------------+--+--+

表格:sub_sections

+----------------+-------------------+------------------+-----+--+
| sub_section_id | sub_section_titel | sub_section_text | sId |  |
+----------------+-------------------+------------------+-----+--+
| 1              | SubOne            | x1               | 1   |  |
+----------------+-------------------+------------------+-----+--+
| 2              | SubTwo            | x2               | 1   |  |
+----------------+-------------------+------------------+-----+--+
| 3              | SubThree          | x3               | 3   |  |
+----------------+-------------------+------------------+-----+--+

这些部分通过第二个表(sub_sections)中的“sId”链接。 因此,标题为“SubOne”的小节是 ID 为 1 的小节(来自小节表)的子小节。

我正在使用此查询来获取结果:

SELECT section_titel as t1, sub_section_titel as t2 
FROM sections LEFT JOIN sub_sections ON section_id = sId; 

我的输出如下所示:

Array
(
    [0] => Array
        (
            [t1] => Section One
            [t2] => SubOne
        )

    [1] => Array
        (
            [t1] => Section One
            [t2] => SubTwo 
        )
)

所以问题是,我得到了表“部分”的多个结果。我需要这样的结果:

   Array
(
    [0] => Array
        (
            [t1] => Section One
            [t2] => Array
                (
                    [0] => SubOne
                    [1] => SubTwo

                )

        )

)

有没有办法做到这一点?非常感谢!

谢谢, J. Doe ;)

【问题讨论】:

可以,只是将一维数组转化为多维数组 你想要Section 2 的任何输出,它没有小节吗? 如果您询问查询是否会输出这样的数组,答案是:不会。但是您可以轻松地遍历此结果并创建所需的数组。我要写一个例子。 我不认为我只能转换这个输出,因为这些数据中实际上没有链接逻辑。我想要一个只有一个空数组“t2”的第二部分的输出。感谢您的帮助。 标题不是链接逻辑吗?好吧,我赞成你的问题,因为这是显示表格数据的好方法。 :) 【参考方案1】:

您可以结合使用 PHP 和 mysql 来做到这一点。将您的查询更改为:

SELECT section_titel as t1, GROUP_CONCAT(sub_section_titel) as t2 
FROM sections LEFT JOIN sub_sections ON section_id = sId
GROUP BY t1
HAVING t2 IS NOT NULL

这会给你一个这样的结果表:

t1              t2
Section One     SubOne,SubTwo
Section Three   SubThree

(如果您想要Section Two 的结果,请从查询中删除HAVING t2 IS NOT NULL 条件)

然后在您的 PHP 中(我假设 mysqli 与连接 $conn

$result = mysqli_query($conn, $sql) or die(mysqli_error($conn));
$out = array();
while ($row = mysqli_fetch_array($result)) 
   $out[] = array('t1' => $row['t1'], 't2' => explode(',', $row['t2']));

print_r($out);

输出:

Array
(
    [0] => Array
        (
            [t1] => Section One
            [t2] => Array
                (
                    [0] => SubOne
                    [1] => SubTwo
                )    
        )

    [1] => Array
        (
            [t1] => Section Three
            [t2] => Array
                (
                    [0] => SubThree
                )
        )
)

【讨论】:

我编辑了我的答案,因为我似乎在谈论你的答案。不是我的意思,对不起。 :) @Rafael 没问题我认为我们都有很好但不同的答案。 感谢你们的帮助。我是这样做的:) 但是我遇到了另一个小问题。我在这个表中有更多的列来保存两个表的显示顺序。在“sections”表中它的sorder,在sub_sections 表中它的“iorder”。如果我尝试显示排序列,它每次都显示为 0。我像这样编辑了我的查询:SELECT section_titel as t1, group_concat(sub_section_titel) as t2, tb1.sorder as sorder FROM section tb1 LEFT JOIN sub_sections tb2 ON tb1.section_id=tb2.sId 既然这个问题已经解决了,你可以再发一篇关于排序数据的文章吗? 如果您使用此答案更改了代码,伙计,您应该为问题选择此答案。 :)【参考方案2】:

您拥有包含所需数据的数组。如果您只想以不同的方式呈现它,您可以遍历它并生成您想要的。我使用的 $arrayInput 与您提供的结构相同。

$arrayOutput = array();
foreach ($arrayInput as $itemInput) 
    $arrayOutput[$itemInput['t1']]['t1'] = $itemInput['t1'];
    $arrayOutput[$itemInput['t1']]['t2'][] = $itemInput['t2'];


echo "<pre>";
print_r($arrayOutput);

【讨论】:

严格来说,这段代码并没有给出想要的输出 OP,因为***数组键是 Section OneSection Two 等,而不是 01 等。跨度> 大多数情况下,数组的键是数字而不是索引用于迭代目的,采用索引作为标题只是将它们转换为他想要的输出数据,数量较少代码尽可能。我认为主数组键是技术性的。

以上是关于PHP SQL Join 查询合并多数组中的内容的主要内容,如果未能解决你的问题,请参考以下文章

许多(许多)SQL JOIN 与多个查询

SQL中的left outer join,inner join,right outer join用法详解

sql的一般查询语句(增删改查中的查)

sql两表联查只要左表一条数据但是查完都多一条

ORACLE LEFT JOIN 子查询 在SQL SERVER中可以使用如图中的子查询,ORACLE中怎么实现

php sql条件参数为数组