0

投稿に対してアクションを実行した最後の人のメールを見つける必要があります。このケースにとって重要ではないいくつかの理由により、データベース構造は少し複雑です。

SELECT u.address 
FROM text t 
JOIN post p ON (p.pid=t.pid) 
JOIN node n ON (n.nid=p.nid) 
JOIN user u ON (t.login=u.login) 
WHERE n.nid='123456' 
AND p.created IN (
   SELECT max(p.created) 
   FROM text t 
   JOIN post p ON (p.pid=t.pid) 
   JOIN node n ON (n.nid=p.nid) 
   WHERE n.nid='123456');

サブクエリを作成せずに max 関数またはその他の方法を使用して最新の日付を取得する方法があるかどうかを知りたいです (これはメインクエリとほぼ同じです)。

どうもありがとうございました

4

2 に答える 2

2

ウィンドウ関数 (別名「分析」関数) を使用して最大日付を計算できます。

次に、作成日が最大と等しいすべての行を選択できます。日にち。

select address
from (
  SELECT u.address,
         p.created,
         max(p.created) over () as max_date
  FROM text t 
    JOIN post p ON (p.pid=t.pid) 
    JOIN node n ON (n.nid=p.nid) 
    JOIN user u ON (t.login=u.login) 
  WHERE n.nid='123456' 
) t
where created = max_date;

質問でover()a を使用しなかったため、句は空です。ただし、たとえばアドレスごとGROUP BYの最大日付が必要な場合は、使用できます

max(p.created) over (partition by t.adress) as max_date

partition byような作品group by

そのクエリを拡張して、複数の に対して機能させることもできますn.id。そのため、パーティションに含める必要があります。

max(p.created) over (partition by n.id, ....) as max_date

ところで:n.id数値列の場合は、文字列リテラルと比較しないでください。'123456'は文字列、123456数値です

于 2013-11-06T10:03:30.980 に答える
0
SELECT address
FROM (
SELECT u.address,
       row_number() OVER (PARTITION BY n.nid ORDER BY p.created DESC) AS rn
  FROM text t  JOIN post p ON (p.pid=t.pid) 
       JOIN node n ON (n.nid=p.nid) 
       JOIN user u ON (t.login=u.login) 
 WHERE n.nid='123456' 
)
WHERE rn = 1;

この関数は、個別の の行番号に対して個別のパーティションを作成して、ROW_NUMBER降順で行に番号を付けます。p.createdPARTITION BY n.nidn.nid

于 2013-11-06T10:10:23.610 に答える