2011-12-15 9 views
0

カテゴリには2つのテーブル(MySQL)があります。必要に応じてこのページのキャッシュをリセットできるように、両方のテーブルで最新の変更の日付を取り出す必要があります。2つのテーブル間で最新の日付を取得するためにMYSQLでMAXを使用しようとしています

私はCASEでMAX()を使うのに苦労しているようですが、現在はこれが動作していますが、製品の日付はデータベースに入力された最新のものであり、必ずしも最新のものではありません。

SELECT c.pageid as caturl, p.updated as pup, c.updated as dup, 

CASE WHEN p.updated > c.updated THEN p.updated ELSE c.updated END AS latest 

FROM products p, categories c 

WHERE p.catid = c.id AND c.hide=0 

GROUP BY c.title 

CASE内でMAX()を使用しようとすると、IFを使用するときのようにエラーが発生します。

ご協力いただきありがとうございます。

+0

あなたの質問は少し不明です。各カテゴリの最新の製品をお探しですか?または、最新の製品と最新のカテゴリを最新のものにしたいですか? – Julien

+0

私はこの2つのうち最新のものが欲しいです。 pup/dupフィールドは私の参照のためだけにあります。 –

+0

2つのクエリを実行してPHPで比較するのは簡単です。 – Julien

答えて

1

[OK]を、私はこの、2つの派生テーブルで刺すと思います。カテゴリテーブルに各カテゴリのMostRecent更新日付を計算

一つ、「catdates」(ともpageidにを返す)

その他、のために特定のカテゴリ内のすべての製品間でMostRecent更新日時を算出し、 productsテーブルの各カテゴリ: "proddates"

次に、私たちは単にcategoryidに加わり、より高い値を取っています。

SELECT c.pageid, 
GREATEST(proddate.LastModified,catdates.LastModified) AS LastModified 
from 
(SELECT p.catid as catid,MAX(p.updated) AS LastModified 
FROM products p 
GROUP BY p.id,p.catid) proddates 
INNER JOIN 
(SELECT c.id AS catid,c.pageid,MAX(c.updated) AS LastModified 
FROM categories c 
WHERE c.hide=0 
GROUP BY c.id,c.pageid) catdates 
ON proddates.catid=catdates.catid 
+0

@AI_ビジネスロジックと製品/カテゴリの関係が、それほど関係がない場合は、より明確にしてください。 – TetonSig

+0

ありがとう、私はいくつかのマイナーな調整を行いました。それは今素晴らしいです: 'SELECT DISTINCT(catdates.pageid)、 GREATEST(proddates.LastModified、catdates.LastModified)AS LastModified から(SELECT p.catidをcatid、MAX (p.pdf)AS LastModified FROMプロダクトp GROUP BY p.id、p.catid)proddates INNER JOIN (SELECT c.id catid、c.pageid、MAX(c。更新された)AS LastModified カテゴリーからc どこc.hide = 0 GROUP BY c.id、c.pageid)catdates ON proddates.catid = catdates.catid' –

0

あなただけの最新の行をしたい場合は、何かのように:それは、クエリを変更しませんが

SELECT 
    c.pageid as caturl 
    , p.updated as pup 
    , c.updated as dup 
    ,GREATEST(p.updated,c.updated) AS latest 
FROM products p 
INNER JOIN categories c ON (p.catid = c.id) 
WHERE c.hide=0 
GROUP BY caturl 
HAVING lastest = MAX(lastest) 

greatest機能は、case whenの必要性を否定。
実際の変更は、最新の行のみを選択するhaving句にあります。

+0

ありがとうございますが、クエリは合計4カテゴリのうち3つしか返しません。すべてのカテゴリに少なくとも1つの製品が含まれていますが、なぜそれがそれを行うのか分かりません。 HAVING句を削除するとすべてのカテゴリが表示されますが、最新の日付は表示されません –

+0

上記のクエリがうまくいかない理由は、そのカテゴリの2つの製品(デフォルトではMySQLが返すもの)データベース内の最新のレコード)が最後に更新されました(つまり、テーブル自体に保存された日付)が他の製品の「更新された」日付より前です。だから、クエリは、その中に最新の日付フィールドを持っているのではなく、db内でCREATEDという最新のレコードを取得するように見えます。 –

+0

次に、caturlでグループ化する必要があります。 – Johan

関連する問題