现在我应该简要解释一下我想做什么。
我有一个“容器”(transmittals)表和每个容器中的另一个“items”(文件)表。
我想输出一个表,列出所有容器,每行末尾有一列,并带有容器中项目的逗号空间列表。目的是实现对每个容器中项目的简单搜索(使用datatables插件)。
我当然可以查询我的容器表,在“PHP while循环”期间,我可以在items表中查询匹配的容器ID。然后我连接每一行的项目,但我想避免多次SQL调用。
所以我创建了一个正确的联接(我在下面写了一个简化的版本)......
SELECT transmittal.*, transmittal_documents.*
FROM transmittal RIGHT JOIN
transmittal_documents
ON transmittal_documents.transmittal_id = transmittal.transmittal_id
将PHP循环编码的最佳方法是什么,只收集表中唯一的“容器”值,同时使用PHP join等连接“items”。
或者,在使用PHP进行处理之前,我可以在SQL中执行此操作吗?
提前感谢您的协助。
答案 0 :(得分:1)
最好的方法是使用group_concat
在SQL中执行此操作:
SELECT t.*, group_concat(td.item) as items
FROM transmittal t LEFT JOIN
transmittal_documents td
ON td.transmittal_id = t.transmittal_id
GROUP BY td.transmittal_id;
我认为您的意思是left join
而不是right join
。 left join
将保留transmittal
表格中的所有内容以及其他表格中的所有匹配项。
答案 1 :(得分:0)
感谢Gordon Linoff的上述答案,我设法让这个为我工作......
选择t。,td。,group_concat(td.item)作为项目 FROM传输t LEFT JOIN transmittal_documents td ON td.transmittal_id = t.transmittal_id GROUP BY t.transmittal_id
我不确定为什么我需要额外的GROUP BY但它有效。没有它我只收到一行数据。
我实际上必须使用文档信息在我的附加表中加入,但如果“td.item”值是一个字符串(这是我在这里导致BLOB到的表中的INT,那么这不会是一个问题)被创建,其中不包含正确的信息。)
看起来GROUP_CONCAT字段可能存在限制而不使用其他参数设置,因此我可能更好地使用PHP中的数组来处理它。