2013-08-26 2 views
0

누군가 다음 문제를 해결하는 방법에 대한 아이디어를 던질 수 있습니까?복잡한 SQL 쿼리 (제안 필요)

내 데이터베이스에 사진, 비디오 및 태그가 있습니다. 태그는 사진과 비디오에 연결될 수 있습니다. 나는 데이터베이스에 태그 ID와 7 일 이전에 수정 된 수를 계산해야하며 사진 및 비디오 자산에 대한 연결 수로 정렬해야합니다.

결국 아이디어는 지난 7 일 동안 사진이나 동영상과 관련된 태그를 출력 할 수 있다는 것입니다. 나는 필드가있는 DB 구조를 적어 둔다.

VIDEO 
    ID 

PICTURE 
    ID 

PICTURE_ATTRMAPPING 
    CS_OWNERID (ID of picture) 
    CS_ATTRID (will store ID of the tag attribute (picture_tag or video_tag)) 
    ASSETVALUE (will store ID OF THE associated tag) 

VIDEO_ATTRMAPPING 
    CS_OWNERID (ID of video) 
    CS_ATTRID (will store ID of the tag attribute (picture_tag or video_tag)) 
    ASSETVALUE (will store ID OF THE associated tag) 

TAG 
    ID 
    UPDATEDATE 

ATTRIBUTES (picture_tag attribute ID is stored here) 
    ID 
    NAME 

우리는 태그, 비디오, 그림 및 속성이 별도의 테이블에 저장되어있는 것을 볼 수있다. VIDEO/PICTURE_ATTRMAPPING 테이블에 CS_ATTRID 열의 비디오 또는 그림 태그 속성 ID 및 ASSETVALUE 열의 태그 ID가있는 레코드가 있으면 태그가 비디오 또는 그림에 의해 참조된다는 것을 알 수 있습니다 (즉, 비디오/그림에 태그 연결이 있음).

하위 쿼리를 사용하여 쿼리를 수행한다고 가정하므로 하위 작업에서이 작업을 중단하고 필요한 모든 정보를 얻는 방법을 알아 냈습니다.

확실히 태그의 ID 비디오 속성과 그림 개체를 얻을 수있을 것이다 : 또한

SELECT id FROM ATTRIBUTES WHERE NAME = 'picture_tag' OR NAME = 'video_tag' 

내가 옛날 n은 태그를 조회 할 수있는 방법의 예 :

SELECT id FROM TAG WHERE updateddate BETWEEN TO_DATE('2013-08-20 00:00:00', 'yyyy-mm-dd hh24:mi:ss') AND CURRENT_DATE 

이것은 복잡한 것처럼 보이지는 않지만 전체 쿼리가 어떻게 나타나고 시작해야하는지에 대해서는 잘 모르겠습니다. 누군가 아이디어 나 표본을 던질 수 있습니까?

나는 Oracle을 사용하고 있지만 mysql도 잘 알고 있으므로 DBMS의 샘플도 훌륭합니다. 내가 나 자신을 분명히했는지 알려줘. 지난 7 일 업데이트 된

답변

1

태그가 같이 쓸 수있다 :

select id from tags where updatedate >= sysdate - 7 

에서 당신이 속성 테이블 만에 두 값을 가지고 말을하는지; 그래서 당신은 그것을 무시할 수 있습니다. PICTURE_ATTRMAPPING 및 VIDEO_ATTRMAPPING 테이블이 더 많아도 가입 할 때 속성이 적용되도록하십시오. 그래도 상관 없습니다.

당신은 태그가 그냥가 *의 _ARRTMAPPING 테이블 중 하나에 존재 함을 시행 할 필요가 사진이나 비디오에 연결되게하려면 :

select * 
    from tags t 
    left outer join picture_attrmappings pa 
    on t.id = pa.assetvalue 
    left outer join video_attrmappings va 
    on t.id = va.assetvalue 
where t.updatedate >= sysdate - 7 
    and (pa.assetvalue is not null 
     or va.assetvalue is not null 
     ) 

당신은 다음되었습니다 태그 ID를 원하는 대부분 수정; 그래서 당신은 계산에 의해 주문해야 : 약간 다른 노트에

select t.id 
    from tags t 
    left outer join picture_attrmappings pa 
    on t.id = pa.assetvalue 
    left outer join video_attrmappings va 
    on t.id = va.assetvalue 
where t.updatedate >= sysdate - 7 
    and (pa.assetvalue is not null 
     or va.assetvalue is not null 
     ) 
group by t.id 
order by count(*) desc 

이 (당신은 아무것도를 남겨 두지 한 가정) 아주 이상한 스키마입니다. 나는 PICTURE_ATTRMAPPINGS가 TAGS와 PICTURE 사이의 접합 테이블이 될 것으로 기대합니다. TAGS 테이블은 고유 한 태그 목록을 저장해야하지만 이는 태그가 아닌 것처럼 보입니다. UPDATEDATE는 PICTURE_ARRTMAPPINGS에 있어야합니다. 그러면 각 태그가 마지막으로 업데이트 된시기 또는 PICTURE에서 알 수 있으므로 모든 태그가 마지막으로 업데이트 된 시점을 알 수 있습니다.

일부 스키마가 누락 된 것으로 의심되지만 제공 한 것과 함께 사진이나 비디오를 사용하는 방법이 없습니다. 사진에 할당

0

모든 태그 ID : 비디오에 할당

SELECT ASSETVALUE 
      FROM PICTURE_ATTRMAPPING 
       JOIN ATTRIBUTES 
       ON (  ATTRIBUTES.ID = PICTURE_ATTRMAPPING.CS_ATTRID 
         AND ATTRIBUTES.NAME = 'picture_tag' 
        ) 

모든 태그 ID :

SELECT ASSETVALUE 
    FROM VIDEO_ATTRMAPPING 
      JOIN ATTRIBUTES 
      ON (  ATTRIBUTES.ID = PICTURE_ATTRMAPPING.CS_ATTRID 
       AND ATTRIBUTES.NAME = 'video_tag' 
      ) 

사용 OUTER 사진을 카운트 가입 및 비디오

SELECT 
    TAG.ID 
, SUM(CASE WHEN PT.ASSETVALUE is not NULL THEN 1 ELSE 0 END) as tagged_picture_number 
, SUM(CASE WHEN VT.ASSETVALUE is not NULL THEN 1 ELSE 0 END) as tagged_vieos_number 
    FROM 
    TAG 
    LEFT OUTER JOIN 
     (
     SELECT ASSETVALUE 
     FROM PICTURE_ATTRMAPPING 
      JOIN ATTRIBUTES 
      ON (ATTRIBUTES.ID = PICTURE_ATTRMAPPING.CS_ATTRID AND ATTRIBUTES.NAME = 'picture_tag') 
    ) PT 
     ON (PT.ASSETVALUE = TAG.ID) 
    LEFT OUTER JOIN 
     (
     SELECT ASSETVALUE 
     FROM VIDEO_ATTRMAPPING 
       JOIN ATTRIBUTES 
       ON (ATTRIBUTES.ID = PICTURE_ATTRMAPPING.CS_ATTRID AND ATTRIBUTES.NAME = 'video_tag') 
    ) VT 
     ON (PT.ASSETVALUE = TAG.ID) 
WHERE 
    TAG.UPDATEDATE <= TRUNC(SYSDATE, 'DD') - 7 
group by TAG.ID 
order by tagged_picture_number + tagged_vieos_number DESC 
; 

태그 된 느릅 나무