postgresql中的分组查询

postgresql中的分组查询,postgresql,Postgresql,我有两张桌子 表1: 表2: 所需输出: 输出要求: 基于用户_id={current user}的模式在表1中不存在 在这里,我们可以看到user_id有1212,92,20,但它没有;t表1中有20,13,14个模式 表2中显示的模式及其注释和开始日期必须最接近于当前时间 模式必须是不同的 我曾尝试使用php代码使用3次执行查询,这需要很长时间 从表2中选择DistinctPattern按模式分组 从表1中选择*其中user\u id=login\u id php中的foreach循环从表2

我有两张桌子

表1:

表2:

所需输出:

输出要求:

基于用户_id={current user}的模式在表1中不存在 在这里,我们可以看到user_id有1212,92,20,但它没有;t表1中有20,13,14个模式 表2中显示的模式及其注释和开始日期必须最接近于当前时间 模式必须是不同的 我曾尝试使用php代码使用3次执行查询,这需要很长时间

从表2中选择DistinctPattern按模式分组 从表1中选择*其中user\u id=login\u id php中的foreach循环从表2中选择*,其中id不在query2和类似“123”的模式的输出中
那么,在postgresql中使用单个查询是否可行呢?这应该可以做到:

SELECT DISTINCT a.pattern
FROM table2 a
LEFT OUTER JOIN table1 b ON a.pattern = b.pattern AND b.user_id = {current_user}
WHERE b.id IS NULL
根据表2中的所有行的模式并仅当它们属于当前用户时,才能将表2中的所有行与表1中的所有行联接起来。然后,您只从中选择那些无法联接的

使现代化 根据你的评论,我也不是100%确定你的意思。一种方法是向上面的查询中添加DISTINCT

另一种变体是

SELECT DISTINCT pattern FROM table2
EXCEPT
SELECT pattern FROM table1 WHERE user_id = {current user}
更新2 根据您希望从表2的最近一行获得附加信息的信息,此查询可能会帮助您:

SELECT a.* FROM table2 a
INNER JOIN (
  SELECT pattern, MAX(start_date) AS max_start_date
  FROM table2
  GROUP BY pattern
) mostrecent
ON a.pattern = mostrecent.pattern AND a.start_date = mostrecent.max_start_date
LEFT OUTER JOIN table1 b ON a.pattern = b.pattern AND b.user_id = {current_user}
WHERE b.id IS NULL
上半部分从表2中请求所有最近的行。以LEFT OUTER JOIN开始的下半部分将此连接到表1,并且与前面一样,只选择那些在表1中没有行的行

另一个特别适用于Postgresql 8.4+的解决方案是

WITH mostrecent AS (
  SELECT *,
    ROW_NUMBER() OVER(PARTITION BY pattern ORDER BY start_date DESC) AS rank
  FROM table2
)
SELECT a.*
FROM mostrecent a
LEFT OUTER JOIN table1 b ON a.pattern = b.pattern AND b.user_id = {current_user}
WHERE b.id IS NULL AND a.rank = 1

我几乎什么都不懂。请更详细地描述你的问题。您需要表2的所有行,表1中user_id=current user的部分中不存在谁的模式?@GhostGambler是的。那么:为什么在所需的输出中只有一个^13.*模式?@joop nope所需的模式是20,13,14,这在表1中对于user_id=13没有出现,这真的很好。但是如果有相同模式的多个记录可用,那么在表2中,它显示了相同模式的所有记录,但我只需要表2中的不同模式。我已经更改了第一个解决方案并添加了另一个解决方案,它返回的结果略有不同,在我的原始答案中。非常感谢你的回复,但正如你所说的,它现在只显示不同的模式,但我想要不同的模式以及该模式的全部细节,所以有可能吗?如果没有进一步的说明,这是不可能的。如果您只需要表2中不同的模式,这是可以的,但是如果您还需要其他列,那么您必须知道附加数据应该来自哪些行。目前,唯一的附加数据是开始日期,所以应该始终返回最近的开始日期吗?不,我还有一些附加字段,但所有这些字段仅在表2中可用,如注释文本,未提及,但我还希望选择注释以及开始日期,仅此而已
SELECT DISTINCT pattern FROM table2
EXCEPT
SELECT pattern FROM table1 WHERE user_id = {current user}
SELECT a.* FROM table2 a
INNER JOIN (
  SELECT pattern, MAX(start_date) AS max_start_date
  FROM table2
  GROUP BY pattern
) mostrecent
ON a.pattern = mostrecent.pattern AND a.start_date = mostrecent.max_start_date
LEFT OUTER JOIN table1 b ON a.pattern = b.pattern AND b.user_id = {current_user}
WHERE b.id IS NULL
WITH mostrecent AS (
  SELECT *,
    ROW_NUMBER() OVER(PARTITION BY pattern ORDER BY start_date DESC) AS rank
  FROM table2
)
SELECT a.*
FROM mostrecent a
LEFT OUTER JOIN table1 b ON a.pattern = b.pattern AND b.user_id = {current_user}
WHERE b.id IS NULL AND a.rank = 1