PHP / MYSQL - 仅在表中显示左连接项,但在列中连接右连接值

时间:2014-01-14 12:56:23

标签: php mysql right-join

现在我应该简要解释一下我想做什么。

我有一个“容器”(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中执行此操作吗?

提前感谢您的协助。

2 个答案:

答案 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 joinleft 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中的数组来处理它。