我有两张桌子:
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。
此外,上述查询是什么类型的查询?某种联接,我在网上找不到类似语法的类似查询。
你能帮助我吗?
我在这里做错了什么?
答案 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)