1

我有两张桌子:

x_community_invites

id  community_id    from    to  registered  message seen    accepted    updated

x_communities

id  name    tags    registered  updated

使用查询:

$query = sprintf("SELECT x_commmunities.* FROM x_commmunities, x_community_invites WHERE x_community_invites.to = '%s' AND x_community_invites.accepted = '%d'", $id, 1);

我的问题是我运行的查询返回 x_communities 表中的所有字段。

示例场景:

x_communities 表中有 2 个社区:

  • id's - 1 和 2 名称
  • 第一社区和第二社区

x_community_invites 表中有 3 个社区邀请:

  • 所有不同的id
  • 2 与第一个社区具有相同的社区 ID,都接受的字段
  • 1 与第 2 个社区具有相同的社区 ID,to = 个人资料 ID 并接受 = 1

但是通过查询,它会获取所有社区 ID 和名称,出于某种我不知道的原因。

我想返回社区 ID 和名称,其中 x_communities_invites.to 字段是用户 ID,x_communities_invites.accepted 字段是 1。

另外,上面的查询是什么查询?某种连接,我在网上找不到类似语法的类似查询。

你能帮帮我吗?

我在这里做错了什么?

4

3 回答 3

2

您还没有链接表。你应该使用加入:

SELECT x_commmunities.* 
FROM x_commmunities
JOIN x_community_invites  on x_commmunities.id=x_community_invites.community_id
WHERE x_community_invites.to = '%s' AND x_community_invites.accepted = '%d'
于 2013-11-05T11:57:20.140 回答
2

这是一个隐式内连接,但缺少连接两个表的条​​件。

SELECT x_commmunities.id, x_commmunities.name, COUNT(x_community_invites.*) AS invites
  FROM x_commmunities, x_community_invites 
 WHERE x_commmunities.id = x_community_invites.community_id
   AND x_community_invites.to = 'some_id_value' 
   AND x_community_invites.accepted = '1'
 GROUP BY x_commmunities.id, x_commmunities.name

这可能会导致重复(同一社区的多个邀请)。GROUP BY 按提供的字段聚合记录。

于 2013-11-05T12:01:18.483 回答
1

使用时,FROM x_commmunities, x_community_invites您正在做一个交叉连接,它将每一行x_communities与每一行相结合x_community_invites,根本不做任何匹配。

您添加了一些单独的连接约束来告诉 DBMS 如何查找匹配对:

WHERE x_communities.id = x_community_invites.community_id

这样,您将获得内部联接。

你也可以在你的 from 子句中使用 join-syntax:

FROM x_communities join x_community_invites on(x_communities.id = x_community_invites.community_id)

或者如果你想要一个外部连接:

FROM x_communities left join x_community_invites on(x_communities.id = x_community_invites.community_id)
于 2013-11-05T11:59:52.163 回答