为什么这个mysql查询不起作用?

时间:2013-11-05 11:51:08

标签: mysql sql left-join

我有两张桌子:

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表中有两个社区:

     
      
  • id's - 1和2名称
  •   
  • 1stCommunity and 2ndCommunity
  •   
     

x_community_invites表中有3个社区邀请:

     
      
  • 所有不同的身份
  •   
  • 2与第一社区具有相同的社区ID,均为接受的字段
  •   
  • 1,社区ID与第二社区相同,= =个人资料ID,已接受= 1
  •   
     

但是通过查询,它会抓取所有社区ID和名称   我不知道的一些原因。

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

此外,上述查询是什么类型的查询?某种联接,我在网上找不到类似语法的类似查询。

你能帮助我吗?

我在这里做错了什么?

3 个答案:

答案 0 :(得分:2)

您还没有链接表格。你应该使用JOIN:

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'

答案 1 :(得分: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按提供的字段聚合记录。

答案 2 :(得分:1)

使用FROM x_commmunities, x_community_invites时,您正在进行交叉联接,将x_communities的每一行与x_community_invites中的每一行组合在一起,而不进行任何匹配。

您已添加一些单独的join-constraint以告知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)