查询 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/ 很方便。