查询 Postgres 中未知数量的关键字
Query unknown number of keywords in Postgres
我目前在节点中使用 postgres 来查询所有具有与其帐户相关联的特定标签的用户(注意:我正在使用 node-postgres):
query = 'SELECT tags.*, pl.email FROM admin.tags tags
LEFT JOIN gameday.player_settings pl
ON tags.player_id = pl.id
WHERE tags.tag = '
client.query(
query,
[tagName],
function(err, results) {
...
[tagName]
然后传递到 WHERE
子句。
我的目标是通过未知数量的标签和 return 所有拥有与其帐户关联的所有这些标签的用户进行查询。因此,我想传入一个长度未知的数组 [tagNames]
,而不是 [tagName]
,但我不确定如何完成此操作。
你需要把问题倒过来。而不是:
哪些用户拥有所有这些标签,你需要询问哪些用户没有这些标签中的一个或多个不存在。这是双重否定。
您还需要一种传递标签集的方法。如果客户端语言绑定支持,最好的方法是作为数组值查询参数。如果客户端绑定不支持数组值参数,您将需要动态 SQL.
一个公式可能是(未经测试,因为您没有提供示例架构和数据):
SELECT pl.email
FROM gameday.player_settings pl
WHERE NOT EXISTS (
SELECT 1
FROM unnest(?) AS wanted_tags(tag)
LEFT JOIN admin.tags tags
ON tags.tag = wanted_tags.tag
WHERE tags.player_id = pl.id
AND wanted_tags.tag IS NULL
);
对 IS NULL
进行左连接和过滤称为左反连接。它保留 左连接条件不 匹配的行。因此,在这种情况下,仅当 没有与该玩家关联的匹配标签 时,我们才保留 wanted_tags
数组中的标签。如果留下任何标签,则 WHERE NOT EXISTS
returns 为假,因此玩家被排除在外。
三思而行,不是吗?这个很容易出错所以test.
这里?
应该是你的编程语言PostgreSQL数据库绑定的查询参数占位符。我不知道 node.js 是什么。这仅在您可以将数组作为节点中的查询参数传递时才有效。如果不是,则必须使用动态 SQL 生成 ARRAY['x','y','z']
表达式或 (VALUES ('x'), ('y'), ('z'))
子查询。
P.S。请尽可能提供 示例架构和数据 问题。 http://sqlfiddle.com/ 很方便。
我目前在节点中使用 postgres 来查询所有具有与其帐户相关联的特定标签的用户(注意:我正在使用 node-postgres):
query = 'SELECT tags.*, pl.email FROM admin.tags tags
LEFT JOIN gameday.player_settings pl
ON tags.player_id = pl.id
WHERE tags.tag = '
client.query(
query,
[tagName],
function(err, results) {
...
[tagName]
然后传递到 WHERE
子句。
我的目标是通过未知数量的标签和 return 所有拥有与其帐户关联的所有这些标签的用户进行查询。因此,我想传入一个长度未知的数组 [tagNames]
,而不是 [tagName]
,但我不确定如何完成此操作。
你需要把问题倒过来。而不是:
哪些用户拥有所有这些标签,你需要询问哪些用户没有这些标签中的一个或多个不存在。这是双重否定。
您还需要一种传递标签集的方法。如果客户端语言绑定支持,最好的方法是作为数组值查询参数。如果客户端绑定不支持数组值参数,您将需要动态 SQL.
一个公式可能是(未经测试,因为您没有提供示例架构和数据):
SELECT pl.email
FROM gameday.player_settings pl
WHERE NOT EXISTS (
SELECT 1
FROM unnest(?) AS wanted_tags(tag)
LEFT JOIN admin.tags tags
ON tags.tag = wanted_tags.tag
WHERE tags.player_id = pl.id
AND wanted_tags.tag IS NULL
);
对 IS NULL
进行左连接和过滤称为左反连接。它保留 左连接条件不 匹配的行。因此,在这种情况下,仅当 没有与该玩家关联的匹配标签 时,我们才保留 wanted_tags
数组中的标签。如果留下任何标签,则 WHERE NOT EXISTS
returns 为假,因此玩家被排除在外。
三思而行,不是吗?这个很容易出错所以test.
这里?
应该是你的编程语言PostgreSQL数据库绑定的查询参数占位符。我不知道 node.js 是什么。这仅在您可以将数组作为节点中的查询参数传递时才有效。如果不是,则必须使用动态 SQL 生成 ARRAY['x','y','z']
表达式或 (VALUES ('x'), ('y'), ('z'))
子查询。
P.S。请尽可能提供 示例架构和数据 问题。 http://sqlfiddle.com/ 很方便。