2013-03-04 4 views
0

사용자가 감사를 위해 이미지를 업로드 할 수있는 웹 사이트가 있습니다. 사용자는 먼저 auditID에 대한 난수와 감사 테이블에 저장된 dateStart (사용자가 DATETIME이 아닌 DATE로 저장되는 날짜)를 갖는 감사를 작성합니다. 그런 다음 업로드 할 이미지를 선택하고 ID (imageID)와 서버의 파일 경로 (imageLocation) 및 이미지 테이블에 저장되는 '표준'유형을 지정합니다. auditID는 이미지 테이블의 외래 키입니다.mysql 그룹을 사용한 후 가장 높은 ID 값을 얻습니다.

같은 이미지를 다른 감사에 다시 사용하면 이전과 동일한 값, 새로운 imageID 및 새 auditID가있는 새로운 dateStart가있는 데이터베이스의 다른 항목이 만들어집니다.

이러한 이미지는 imageLocation으로 이미지를 그룹화하는 스크립트를 사용하여 표시되므로 MAX (dateStart)를 사용하여 마지막으로 사용한 감사 이름과 함께 각 이미지의 인스턴스 하나가 표시됩니다.

사용자가 동일한 dateStart를 가진 여러 감사에 대해 동일한 이미지를 사용하지 않는 경우이 방법이 유용합니다.이 경우 동일한 날짜의 각 감사마다 한 번씩 여러 번 표시됩니다. 가장 쉬운 방법은 dateStart를 date에서 datetime으로 변경하는 것이지만 실행 가능한 옵션이 아니기 때문에 차선책은 MAX (dateStart)뿐만 아니라 MAX (imageID)를 찾는 것입니다.

GROUP 다음에 SORT BY i.imageID LIMIT 1 DESC를 추가하려고 시도했지만 각 이미지의 최신 인스턴스보다는 하나의 이미지 만 반환합니다. 이것은 내가 지금까지 무엇을 가지고

...

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%'" 

나는 같은 이미지가 같은 날짜에 두 번 이상 사용하는 경우 그 다음, 지금 않는 동일한 결과를 반환하지만 싶습니다 I 가장 높은 imageID를 가진 이미지 인스턴스를 원한다.

이 정보가 충분하기를 바란다면 테이블이 복잡하기는하지만 필요하다면 샘플과 데이터를 제공 할 수는 있지만 시간이 걸릴 것입니다.

도움이 될 것입니다.

답변

1

audit 레코드가있는 image 개의 레코드를 저장하고 있습니다. 때로는 중복 된 이미지가로드되고 동일한 imageLocation으로 식별됩니다. 최신 이미지 레코드 및 관련 감사 레코드를 찾습니다.

쿼리가 제대로 된 것처럼 보이지만 모든 이미지 ID가 고유 한 경우 내부 쿼리의 audit 테이블에 조인 할 필요가 없습니다. 이후 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) 

UPDATE : CTE를 당신이 당신의 원래 형식으로 돌아갈 수없는

(I 테이블을 생성하고 테스트하는 데이터를로드하지 않은주의, 이것은 단지에서 질문의 기반으로한다 쿼리) :

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) 
+0

안녕하세요, 고마워요.하지만 'SQL 구문에 오류가 있습니다. 'WITH images near (SELECT imageLocation, MAX (imageID) AS newest_imageID'at line 1 '근처에서 사용할 정확한 문법은 MySQL 서버 버전에 해당하는 매뉴얼을 확인하십시오. – tatty27

+0

MySQL이 WITH 절을 지원하지 않는 것 같습니다 – tatty27

+0

Perfect 고마워, 하나의 경미한 찬사, 선택 하위 쿼리에서 FROM 절에 'image i'를 추가해야했지만 지금은 대단히 감사합니다. – tatty27

관련 문제