Sql 如何从数据库中选择一组特定的元素?
我正在开发一个数据库,它可以合成如下:Sql 如何从数据库中选择一组特定的元素?,sql,Sql,我正在开发一个数据库,它可以合成如下: TAB1: NICK, COUNTRY TAB2: PLAYER, FRIEND 在TAB2中,玩家和朋友都可以连接到各自的TAB1.NICK;尼克是主键,玩家和朋友都是外键 我需要知道有多少球员只和来自同一个国家的人交朋友,但是,几个下午后我仍然无法做到这一点 我最后一次尝试: select count(*) from TAB1 as p1 join TAB2 as f1 on p1.nick = f1.player join TAB1 as p2 o
TAB1: NICK, COUNTRY
TAB2: PLAYER, FRIEND
在TAB2中,玩家和朋友都可以连接到各自的TAB1.NICK;尼克是主键,玩家和朋友都是外键
我需要知道有多少球员只和来自同一个国家的人交朋友,但是,几个下午后我仍然无法做到这一点
我最后一次尝试:
select count(*) from TAB1 as p1
join TAB2 as f1 on p1.nick = f1.player
join TAB1 as p2 on f1.friend = p2.nick
where p1.country is not null and p2.country is not null
and p1.country = p2.country
and not exists (select * from TAB1 as p0
join TAB2 as f0 on p0.nick = f0.nick
join TAB1 as p3 on f0.friend = p3.nickname
where p0.country is not null and p3.country is not null
and p0.country <> p3.country)
将查询构建为单件餐-从简单的部分开始,然后继续到较难的部分。使其工作的关键观察是,需要对同一个表使用两个连接。此查询提供两人来自同一国家的配对列表:
SELECT p1.nick, p1.country, p2.nick, p2.country
FROM tab2
JOIN tab1 AS p1 ON tab2.player = p1.nick
JOIN tab1 AS p2 ON tab2.friend = p2.nick
WHERE p1.country = p2.country
SELECT COUNT(DISTINCT p1.nick)
FROM tab2
JOIN tab1 AS p1 ON tab2.player = p1.nick
JOIN tab1 AS p2 ON tab2.friend = p2.nick
WHERE p1.country = p2.country
这将统计来自同一国家的一个或多个朋友的玩家数量:
SELECT p1.nick, p1.country, p2.nick, p2.country
FROM tab2
JOIN tab1 AS p1 ON tab2.player = p1.nick
JOIN tab1 AS p2 ON tab2.friend = p2.nick
WHERE p1.country = p2.country
SELECT COUNT(DISTINCT p1.nick)
FROM tab2
JOIN tab1 AS p1 ON tab2.player = p1.nick
JOIN tab1 AS p2 ON tab2.friend = p2.nick
WHERE p1.country = p2.country
而且,如果你所追求的是那些只有来自同一个国家的朋友的人,正如评论中所建议的,那么你需要确定玩家没有朋友,而朋友的国家不是玩家的国家。你会进入一个有趣的问题:没有朋友的人会被计算在内吗?因为他们没有来自同一个国家的朋友,所以下面的查询不会将他们计算在内:
SELECT COUNT(DISTINCT p1.nick)
FROM tab2
JOIN tab1 AS p1 ON tab2.player = p1.nick
JOIN tab1 AS p2 ON tab2.friend = p2.nick
WHERE p1.country = p2.country
AND NOT EXISTS
(SELECT *
FROM tab2 AS t2
JOIN tab1 AS p3 ON t2.player = p3.nick
JOIN tab1 AS p4 ON t2.friend = p4.nick
WHERE p3.country != p4.country
AND p3.nick = p1.nick
)
这表示至少有一个本国朋友的玩家,而来自不同国家的玩家却没有朋友。建立一份完整的查询-从简单的部分开始,继续到困难的部分。使其工作的关键观察是,需要对同一个表使用两个连接。此查询提供两人来自同一国家的配对列表:
SELECT p1.nick, p1.country, p2.nick, p2.country
FROM tab2
JOIN tab1 AS p1 ON tab2.player = p1.nick
JOIN tab1 AS p2 ON tab2.friend = p2.nick
WHERE p1.country = p2.country
SELECT COUNT(DISTINCT p1.nick)
FROM tab2
JOIN tab1 AS p1 ON tab2.player = p1.nick
JOIN tab1 AS p2 ON tab2.friend = p2.nick
WHERE p1.country = p2.country
SELECT TAB2.PLAYER, TAB1.COUNTRY
FROM TAB2 PLAYER_TAB2
JOIN TAB1 PLAYER_TAB1 ON TAB1.NICK = TAB2.PLAYER
WHERE NOT EXISTS (SELECT NULL
FROM TAB2
JOIN TAB1 ON TAB1.NICK = TAB2.FRIEND
AND TAB1.COUNTRY != PLAYER_TAB1.COUNTRY
WHERE TAB2.PLAYER = PLAYER_TAB2.PLAYER)
这将统计来自同一国家的一个或多个朋友的玩家数量:
SELECT p1.nick, p1.country, p2.nick, p2.country
FROM tab2
JOIN tab1 AS p1 ON tab2.player = p1.nick
JOIN tab1 AS p2 ON tab2.friend = p2.nick
WHERE p1.country = p2.country
SELECT COUNT(DISTINCT p1.nick)
FROM tab2
JOIN tab1 AS p1 ON tab2.player = p1.nick
JOIN tab1 AS p2 ON tab2.friend = p2.nick
WHERE p1.country = p2.country
而且,如果你所追求的是那些只有来自同一个国家的朋友的人,正如评论中所建议的,那么你需要确定玩家没有朋友,而朋友的国家不是玩家的国家。你会进入一个有趣的问题:没有朋友的人会被计算在内吗?因为他们没有来自同一个国家的朋友,所以下面的查询不会将他们计算在内:
SELECT COUNT(DISTINCT p1.nick)
FROM tab2
JOIN tab1 AS p1 ON tab2.player = p1.nick
JOIN tab1 AS p2 ON tab2.friend = p2.nick
WHERE p1.country = p2.country
AND NOT EXISTS
(SELECT *
FROM tab2 AS t2
JOIN tab1 AS p3 ON t2.player = p3.nick
JOIN tab1 AS p4 ON t2.friend = p4.nick
WHERE p3.country != p4.country
AND p3.nick = p1.nick
)
这表示至少有一个本国朋友的玩家,而来自其他国家的玩家没有朋友。请?关系,尤其是已编辑的关系,很抱歉丢失了一些内容。您应该设计表,使任何列都不存储空值,这样您就不必再使用“is not null”条件。说玩家p1有一个朋友是没有意义的,但我不知道他是谁,这就是tab2.friend中的null的意思;对于tab2.player也是如此。即使你不知道他们的国家,也可能会有一个识别尼克的商业案例,更简单的说,应该为每个有效的尼克提供一个国家代码,否则尼克将无效,除非我们知道此人来自或声称来自哪个国家。@Jonathan:我们接受NULLs作为国家,因为数据库的主要数据在这里没有显示。我们不想浪费宝贵的数据,因为我们使用的脚本无法仅检索国家,所以我们保留了它。请使用数据库模式?关系,尤其是已编辑的关系,很抱歉丢失了一些内容。您应该设计表,使任何列都不存储空值,这样您就不必再使用“is not null”条件。说玩家p1有一个朋友是没有意义的,但我不知道他是谁,这就是tab2.friend中的null的意思;对于tab2.player也是如此。即使你不知道他们的国家,也可能会有一个识别尼克的商业案例,更简单的说,应该为每个有效的尼克提供一个国家代码,否则尼克将无效,除非我们知道此人来自或声称来自哪个国家。@Jonathan:我们接受NULLs作为国家,因为数据库的主要数据在这里没有显示。我们不想浪费宝贵的数据,因为我们使用的脚本无法只检索国家,所以我们保留了它。这难道不会只显示来自同一个国家的朋友,而不是来自同一个国家的朋友吗?我认为他需要一个不存在的。JNK是正确的,这个查询仅仅是来自同一个国家的朋友,而不是从不同的地方考虑这些。@ JNK,@ Gurzon:编辑制作…通常,如果分阶段进行,则很容易构建复杂的查询。感谢您为我指明了正确或更接近正确的方向。@Johnathan-+1用于编辑。原帖供参考:我需要找出有多少玩家只与来自同一国家的人交朋友这不只是显示那些有来自同一国家的朋友的人,而不是那些只有来自同一国家的朋友的人吗?我认为他需要一个不存在的。JNK是正确的,这个查询仅仅是来自同一个国家的朋友,而不是从不同的地方考虑。
SELECT TAB2.PLAYER, TAB1.COUNTRY
FROM TAB2 PLAYER_TAB2
JOIN TAB1 PLAYER_TAB1 ON TAB1.NICK = TAB2.PLAYER
WHERE NOT EXISTS (SELECT NULL
FROM TAB2
JOIN TAB1 ON TAB1.NICK = TAB2.FRIEND
AND TAB1.COUNTRY != PLAYER_TAB1.COUNTRY
WHERE TAB2.PLAYER = PLAYER_TAB2.PLAYER)
@JNK,@Gurzon:已进行编辑。。。通常,如果分阶段进行,则很容易构建复杂的查询。感谢您为我指明了正确或更接近正确的方向。@Johnathan-+1用于编辑。参考原文:我需要知道有多少玩家只和来自同一个国家的人交朋友