-1

サイト呼び出しイメージと監査にアップロードされるイメージに関する情報を格納する 2 つのテーブルがあります。イメージがアップロードされると、そのパスは image.imageLocation に格納され、監査に使用されると、auditID が同じテーブルに保存されます。auditID は、テーブルを結合するために使用される値です。

audit.dateStart である監査が行われた日付を使用して、イメージが使用された最新の監査を教えてくれるクエリを作成しようとしています。

私がこれまでに持っているクエリは...

SELECT * FROM (
    SELECT image.imageID AS newest_image, image.userID AS image_userID,
           image.auditID as image_auditID, image.type AS image_type,
           image.imageLocation AS location
    from image
) image
LEFT JOIN audit ON image_auditID = audit.auditID
WHERE image_userID = '$id' AND image_type = 'standard'
      AND dateStart = MAX(dateStart)
GROUP by location

これにより、GROUP の不適切な使用を示すエラーがスローされます。

どんな助けでもありがたく受け取られます

これがテーブル構造です

audit

auditID     varchar(255)        
userID      int(11)     
dateStart       date        
dateEnd     date    
auditName       varchar     
auditDesc       varchar     
imagesUploaded  tinyint 
actionPlan      varchar     
auditComplete   tinyint 
dateComplete    datetime

image

imageID         int(10)     
name            varchar(255)        
auditID         varchar(255)        
imageGrade          int(1)      
exposure            varchar(255)        
positioning         varchar(255)        
patient         varchar(255)        
equipment           varchar(255)        
positioningReason   varchar(255)        
exposureReason  varchar(255)        
patientReason   varchar(255)        
comment         varchar(255)        
auditDate           datetime    
imageLocation   varchar(255)        
thumbnail           text        
xrayType            varchar(10)     
type            varchar(255)        
userID          int(11) 

Some sample data

imageID = 563
name = standard_16.jpg
auditID = 1360318160843025059
imageLocation = upload/2/standards/standard_16.jpg
type = standard
userID = 2

imageID = 565
name = standard_18.jpg
auditID = 1360318160843025059
imageLocation = upload/2/standards/standard_18.jpg
type = standard
userID = 2

imageID = 566
name = standard_18.jpg
auditID = 13603248241777655575
imageLocation = upload/2/standards/standard_18.jpg
type = standard
userID = 2

auditID = 1360318160843025059
userID = 2
dateStart = 2013-02-14

auditID = 13603248241777655575
userID = 2
dateStart = 2013-02-09

ご覧のとおり、同じイメージを複数の監査に使用できます。イメージを最後に使用した監査を知りたいのですが、この場合、結果は auditID 1360318160843025059 になります。

4

2 に答える 2

1

サブクエリを使用してみましたか。このサブクエリはmax(dateStart)、各監査を取得します。次に、この結果をauditテーブルに結合して、最大日付の行のすべての詳細を返します。

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,
  a1.*
FROM image i
LEFT JOIN audit a1
  on i.auditID = a1.auditID
INNER JOIN 
(
  select auditID, max(dateStart) MaxDate
  from audit
  group by auditID
) a2
  on a1.auditID = a2.auditID
  and a1.dateStart = a2.MaxDate
WHERE i.userID = '$id' 
  AND i.type = 'standard' 

編集、最後の画像/監査のみの場合は、次を使用できます。

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,
  a1.*
FROM image i
LEFT JOIN audit a1
  on i.auditID = a1.auditID
INNER JOIN 
(
  select max(dateStart) MaxDate
  from audit
) a2
  on a1.dateStart = a2.MaxDate
WHERE i.type = 'standard';

デモで SQL Fiddle を参照してください


別の推測:

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' 
于 2013-02-08T17:34:06.637 に答える
1

これを試して

 SELECT * FROM (
SELECT image.imageID AS newest_image, image.userID AS image_userID,
       image.auditID as image_auditID, image.type AS image_type,
       image.imageLocation AS location
 from image
 GROUP by location
              ) image
LEFT JOIN audit ON image_auditID = audit.auditID
WHERE image_userID = '$id' AND image_type = 'standard'
  AND dateStart = MAX(dateStart)

編集。

 SELECT image.imageID AS newest_image, image.userID AS image_userID,
   image.auditID as image_auditID, image.type AS image_type,
   image.imageLocation AS location
   from image
  LEFT JOIN audit ON image.userID = audit.auditID
  INNER JOIN 
 (
   select max(dateStart) MaxDate
   from audit
  ) audit2
  on audit.dateStart = audit2.MaxDate
  WHERE  image.type = 'standard'
  GROUP by image.imageLocation

SQL フィドルのデモ

于 2013-02-08T17:38:11.877 に答える