gpt4 book ai didi

sql - 如何跨多行查询匹配值?

转载 作者:行者123 更新时间:2023-11-29 11:53:34 33 4
gpt4 key购买 nike

我有 2 个表:通过 player_tags 加入的玩家和标签。我只想让玩家 Aaron 匹配 1 个或多个标签名称。在我的例子中,我想要所有具有标签“test”和“new”的玩家,但由于他们的属性跨越 2 行,我不知道该怎么做。

table: players
ID NAME
----- --------
1 AARON
2 JAMES


table: player_tags
ID PLAYER_ID TAG_ID
----- --------- --------
1 1 1
2 1 2
3 2 1


table: tags
ID NAME
----- --------
1 test
2 new

我创建的这个查询当然不起作用,因为标记“test”和标记“new”在 2 个不同的行中。

SELECT "players".name, "tags".name FROM "players"
INNER JOIN "player_tags" ON "player_tags"."player_id" = "players"."id"
INNER JOIN "tags" ON "tags"."id" = "player_tags"."tag_id"
WHERE
"tags"."name" IS NOT NULL AND "tags"."name" = 'test' AND "tags"."name" = 'new'

我希望得到玩家 1 作为响应,因为它与两个标签都匹配。如果我将“AND”更改为“OR”,我会得到两个玩家,但这不是我想要的。我正在使用 postgres 顺便说一下。

最佳答案

select p.name as player_name, string_agg(t.name, ', ') as tags
from players p
join player_tags pt ON pt.player_id = p.id
join tags t ON t.id = pt.tag_id
where t.name in ('new', 'test')
group by p.name
having count(t.id) > 1

上面的代码实现了“如果它匹配 1 个或多个标签名称”部分,因此它返回那些具有至少其中一个标签的玩家。

如果您只想要那些恰好具有这两个标签的播放器,您可以使用:

select p.name as player_name, string_agg(t.name, ', ') as tags
from players p
join player_tags pt ON pt.player_id = p.id
join tags t ON t.id = pt.tag_id
group by p.name
having array_agg(t.name order by t.name) = array['new', 'test']

请注意,您需要按字母顺序在数组中指定标签名称。

在线示例:http://rextester.com/NBKWU93227

关于sql - 如何跨多行查询匹配值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42167465/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com