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 One
、Section Two
等,而不是 0
、1
等。跨度>
大多数情况下,数组的键是数字而不是索引用于迭代目的,采用索引作为标题只是将它们转换为他想要的输出数据,数量较少代码尽可能。我认为主数组键是技术性的。以上是关于PHP SQL Join 查询合并多数组中的内容的主要内容,如果未能解决你的问题,请参考以下文章
SQL中的left outer join,inner join,right outer join用法详解