2013-06-22 8 views
0

У меня есть 3 стола, которые я бы хотел собрать. Видео-таблица со всеми видео пользователями, таблица изображений со всеми изображениями пользователей и таблицей камер. Я хочу, чтобы перечислить все изображения и видео и отсортировать ихприсоединиться к 3 столам сорта

prefix_videos столом с (videoid, userid, cameraid, videosize, datetime, deleted, videolength, videoname)

столом prefix_images с (imageid, userid, cameraid, imagesize, datetime, deleted, imagename)

столом prefix_cameras с (userid, cameraid, ...)

Раньше у меня был только стол видео, так этот запрос дал me, что мне было нужно:

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

Это не работает для меня, я думаю, потому что столбцы не совпадают. Поэтому я считаю, что это нарушает правила UNION. Все еще пытаясь понять это ... – Tom

+0

вы можете использовать cast() для преобразования разных столбцов в разные типы. – AdrianBR

0

Короче говоря, да, вы можете ПРИСОЕДИНИТЬСЯ ПРИ СОЕДИНЕНИИ ПРИ СОЕДИНЕНИИ. Синтаксис обычно выглядит как

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

и так далее. Я упрощаю, но вы понимаете.

+0

Ах, реальный вопрос -should- я трехходовой JOIN, не -can- I. У AdrianBR есть лучший ответ. – catfood

Смежные вопросы