有人可以向我提出有关如何解决以下问题的想法:
我的数据库中有图片,视频和标签。标签可以与图片和视频相关联。我必须在数据库中查询7天或更早之前修改过的标签ID和计数,并按照它们对图片和视频资产的关联计数对它们进行排序。
所以我的想法是,最后我可以输出最近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的样本都会很棒。如果我做得足够清楚,请告诉我。
答案 0 :(得分:1)
过去7天内更新的标记可以写成:
select id from tags where updatedate >= sysdate - 7
根据您的说法,ATTRIBUTES表中只有两个值;所以你可以忽略它。即使它有更多的表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中,这样您就可以知道所有标签的上次更新时间(或两者都有)。
我怀疑你错过了一些架构但是我没有看到你提供的使用PICTURE或VIDEO的方法。
答案 1 :(得分: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 JOIN计算标记的图片和视频
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
;