2013-06-22 29 views
0

我有3张桌子我想放在一起。包含所有用户视频的视频表,包含所有用户图像的图像表和摄像机表。我想列出所有的图片和视频,并与(videoid, userid, cameraid, videosize, datetime, deleted, videolength, videoname)加入3张表排序

prefix_images表(imageid, userid, cameraid, imagesize, datetime, deleted, imagename)

prefix_cameras表(userid, cameraid, ...)

对它们进行排序

prefix_videos表以前我只用了视频表,这个查询了我什么我需要:

SELECT prefix_videos.videoid, prefix_videos.videoname, prefix_videos.videosize, 
prefix_videos.videodatetime, prefix_videos.videolength, prefix_cameras.cameraname FROM 
prefix_videos INNER JOIN prefix_cameras USING (userid,cameraid) WHERE 
prefix_videos.deleted IS NULL AND prefix_videos.userid=xxx ORDER BY 
prefix_videos.datetime DESC 

但现在我正在添加一个图像表。所以,我要的是建立一个表:

imageid/videoid, cameraid, imagesize/videosize, datetime (either from image or video table), videoname/imagename

因为我现在结合了图像和视频表给出一个结果,我不知道其他INNER JOIN有道理吗?

这里的另一个重要组成部分是为NULL删除的条目,并通过无论是来自图像或视频的日期顺序对这些能力的检查。

回答

1

您可以分别创建两个选择适合视频和图像,然后用工会把他们聚在一起。凌乱的部分是,你必须经过排序AFAIK

select * from(
SELECT prefix_videos.videoid, prefix_videos.videoname, prefix_videos.videosize, 
    prefix_videos.videodatetime, prefix_videos.videolength, prefix_cameras.cameraname FROM 
    prefix_videos INNER JOIN prefix_cameras USING (userid,cameraid) WHERE 
    prefix_videos.deleted IS NULL AND prefix_videos.userid=xxx ORDER BY 
    prefix_videos.datetime DESC 
    union 
    SELECT prefix_images.imageid, prefix_images.imagename, prefix_images.imagesize, 
    prefix_images.imagesdatetime, prefix_images.videolength, prefix_cameras.cameraname FROM 
    prefix_images INNER JOIN prefix_cameras USING (userid,cameraid) WHERE 
    prefix_images.deleted IS NULL AND prefix_images.userid=xxx ORDER BY 
    prefix_images.datetime DESC 
)a order by 'mycolumn' 

select imageid/videoid, cameraid, imagesize/videosize, datetime (either from image or video table), videoname/imagename 

from 
(select imageid as 'imageid/videoid', cameraid ,imagesize as 'imagesize/videosize', datetime, imagename as 'videoname/imagename' from prefix_images where ... 
union 
select videoid as 'imageid/videoid', cameraid ,videosize as 'imagesize/videosize', datetime, videoname as 'videoname/imagename' from prefix_videos where ... 
)as temptable 
inner join whatever_your_table on temptable.selected_column=whatever_your_table .equivalent_column 
order by 'mycolumn' 
+0

这不适合我,我认为是因为列不一样。所以我认为这违反了联盟的规则。仍然试图找出它...... – Tom

+0

你可以使用cast()将不同的列转换为不同的类型。 – AdrianBR

0

总之,是的,你可以加入JOIN后加入。语法通常看起来像

select [stuff] from [tableA] 
join [tableB] 
on [tableA.column] = [tableB.column] 
join [tableC] 
on [tableAorTableB.column] = [tableC.column] 
where [conditions] 

等等。我简单化了,但你明白了。

+0

啊,真正的问题是-should-我做了三路连接,不-can- I. AdrianBR在这里有更好的答案。 – catfood