在一个查询上执行:最好的方法是什么?

时间:2011-04-29 18:38:12

标签: php sql

我正在构建一个PHP5应用程序,我需要列出其中的项目以及有关它们的所有相关信息。为此,我有三个表,名为: kc_projects kc_project_members kc_users 。我在所有这些中都有ID,并且在 kc_project_members 的每一行中都有一列,将相应的用户链接到他注册的项目。

现在,我有这个问题:

SELECT * FROM kc_projects AS p
INNER JOIN kc_project_members AS pm
ON pm.PROJECT_ID = p.ID
INNER JOIN kc_users AS u
ON u.ID = pm.USER_ID

但它并没有像我想的那样工作,因为它实际上检索了我想要的结果,但不是我想要的方式。它创建了一个数组和另一个数组,在该数组中我有另一个包含查询结果的数组。它还为每个用户创建了一个重复的结果,这意味着如果我只有一个用户在该项目中注册,它只返回一个项目。但是,如果我有更多,它会像注册用户一样返回我的数组,并且该数组总是具有相同的项目信息。我希望他只返回一个项目,并在其中包含一个包含用户的数组。

无论如何这样做,正确的方法?

谢谢,
焦烧

1 个答案:

答案 0 :(得分:0)

我假设数组是指结果集......

是的 - 这是可能的,但可能并不完全像您想象的那样,因为所有结果集必须具有相同的列数,如果您说...项目成员为项目的话,这是不可能的id为id为7的项目的id为1和5的项目成员。

您必须准确指定要返回的列 - SELECT *不会执行操作(无论如何都要做坏事,特别是如果需要良好的性能)。此外,用户的ID,用户名或每个项目引用用户需要获得的任何列都必须以字符串形式连接,稍后您应该使用PHP进行解析。

以下是一个例子:

SELECT p.ID, p.PROJECT_NAME, GROUP_CONCAT(u.USERNAME SEPARATOR ',') AS PROJECT_MEMBERS
FROM kc_projects p
     JOIN kc_project_members pm ON p.ID=pm.PROJECT_ID
     JOIN kc_users u ON pm.USER_ID=u.ID
GROUP BY p.ID;