0

ユーザーが監査目的で画像をアップロードできるWebサイトがあります。ユーザーは最初に監査を作成します。この監査には、auditIDの乱数と、監査テーブルに格納されているdateStart(ユーザーが選択した日付がDATETIMEではなくDATEとして格納されます)が含まれます。次に、アップロードする画像を選択します。この画像には、ID(imageID)と、サーバー上のファイルパス(imageLocation)、および画像テーブルに保存される常に「標準」のタイプが割り当てられます。auditIDは、イメージテーブルの外部キーです。

同じイメージが別の監査に再利用される場合、データベース内に、以前と同じ値、新しいimageID、および新しいdateStartを持つ新しいauditIDを持つ別のエントリが作成されます。

次に、これらの画像は、画像をそのimageLocationでグループ化するスクリプトを使用して表示されるため、各画像の1つのインスタンスが、MAX(dateStart)を使用して最後に使用された監査の名前とともに表示されます。

これは、ユーザーが同じdateStartの複数の監査に同じ画像を使用しない限り、うまく機能します。その場合、同じ日付の監査ごとに1回ずつ、複数回表示されます。最も簡単な方法は、dateStartをdateからdatetimeに変更することですが、これは実行可能なオプションではないため、次善の策は、MAX(dateStart)だけでなくMAX(imageID)も見つけることです。

GROUPの後にSORTBYi.imageID LIMIT 1 DESCを追加しようとしましたが、各画像の最新のインスタンスではなく、1つの画像のみが返されます。

これは私がこれまでに持っているものです...

SELECT i.imageID AS newest_image, 
       i.userID AS image_userID, 
       i.auditID AS image_auditID, 
       i.type AS image_type, 
       i.imageLocation AS location,
       a.*
       FROM image i
       JOIN audit a
       ON i.auditID = a.auditID
       JOIN 
        (
         SELECT i.imageLocation, MAX(a.dateStart) MaxDate
         FROM image i
             JOIN audit a
             ON i.auditID = a.auditID
         WHERE i.userID = '$id' 
         AND i.type = 'standard' 
         GROUP BY i.imageLocation
        )
      g ON  g.MaxDate = a.dateStart
      AND g.imageLocation = i.imageLocation
      WHERE i.userID = '$id' 
      AND i.type = 'standard'
      AND i.imageLocation NOT LIKE '%standard_examples%'"

現在と同じ結果を返したいのですが、同じ画像が同じ日に複数回使用されている場合は、imageIDが最も高い画像のインスタンスが必要です。

これで十分な情報だといいのですが、テーブルはかなり複雑ですが、必要に応じてそれらとサンプルデータを提供できますが、しばらく時間がかかります。

どんな助けでも大歓迎です。

4

1 に答える 1

1

質問を言い換える試み:image関連付けられたレコードを持つレコードを保存していますaudit。重複したイメージが読み込まれる場合があり、これらは同じimageLocation. 最新のイメージ レコードと関連する監査レコードを検索します。

あなたのクエリはほぼ正しいと思いますが、auditすべての画像 ID が一意である場合、内部クエリでテーブルに結合する必要はありません。audit後にテーブルに参加します。idまた、最大日付がすでに特定されている場合は、再度最大日付に参加する必要はありません。

これは同じクエリの試みです。わかりやすくするためにサブクエリを CTE に取り出しただけですが、元の場所に戻すことができます。

WITH images AS (
    SELECT imageLocation, MAX(imageID) AS newest_imageID
      FROM image
      WHERE i.userID = '$id' 
        AND i.type = 'standard'
        AND i.imageLocation NOT LIKE '%standard_examples%'
      GROUP BY imageLocation
)

SELECT i.imageID AS newest_image, 
       i.userID AS image_userID, 
       i.auditID AS image_auditID, 
       i.type AS image_type, 
       i.imageLocation AS location,
       a.*

  FROM image i
  JOIN images ni ON (i.imageID = ni.newest_imageID)
  JOIN audit a ON (i.auditID = a.auditID)

アップデート:

CTE がなければ、元の形式に戻ることができます (テーブルを作成してテスト用のデータをロードしていないことに注意してください。これは、クエリの質問に基づいているだけです)。

SELECT i.imageID AS newest_image, 
       i.userID AS image_userID, 
       i.auditID AS image_auditID, 
       i.type AS image_type, 
       i.imageLocation AS location,
       a.*

  FROM image i

  JOIN ( SELECT imageLocation, MAX(imageID) AS newest_imageID
               FROM image i
               WHERE i.userID = '$id' 
                 AND i.type = 'standard'
                 AND i.imageLocation NOT LIKE '%standard_examples%'
               GROUP BY imageLocation
       ) ni ON (i.imageID = ni.newest_imageID)

  JOIN audit a ON (i.auditID = a.auditID)
于 2013-03-04T00:48:59.223 に答える