2012-01-09 85 views
0

我沒有很多的關係數據庫的經驗,我這個問題一段時間,但有一點運氣掙扎......「複雜」的MySQL的關係數據庫查詢

所以,我有幾個表:

CREATE TABLE `shows` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `show_name` varchar(200) NOT NULL, 
    PRIMARY KEY (`id`) 
); 

CREATE TABLE `playlists` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` int(11) NOT NULL, 
    `time` int(11) NOT NULL, 
    PRIMARY KEY (`id`) 
); 

CREATE TABLE `items` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `title` varchar(200) NOT NULL, 
    PRIMARY KEY (`id`) 
); 

CREATE TABLE `items_playlists` (
    `item_id` int(11) NOT NULL, 
    `playlist_id` int(11) NOT NULL, 
    PRIMARY KEY (`item_id`,`playlist_id`), 
    KEY `fk01` (`item_id`), 
    KEY `fk02` (`playlist_id`) 
); 

CREATE TABLE `subtitles` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `line1` varchar(500) NOT NULL, 
    `line2` varchar(500) NOT NULL, 
    `line3` varchar(500) NOT NULL, 
    PRIMARY KEY (`id`) 
); 

CREATE TABLE `items_subtitles` (
    `item_id` int(11) NOT NULL, 
    `subtitle_id` int(11) NOT NULL, 
    PRIMARY KEY (`item_id`,`subtitle_id`), 
    KEY `fk01` (`item_id`), 
    KEY `fk02` (`subtitle_id`) 
); 

CREATE TABLE `subtitles_txt` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `subtitle_text` varchar(500) NOT NULL, 
    PRIMARY KEY `id` (`id`) 
); 

playlists.name實際參照shows.id值。

subtitles.line1subtitles.line2subtitles.line3各自對應於subtitles_txt.id

我需要的是基於subtitles_txt.subtitle_text值獲得所有表中的所有行,條件是該值在右側具有通配符(...WHERE subtitle_text LIKE 'value%')。

我覺得很遺憾我不能改變表的結構,因爲這是一些大項目的一部分,很多其他的事情都取決於一些這些表的,所以我真的應該做一些查詢出這...

+0

「要獲取所有行」......所有的行?只有那些在subtitles.text或所有與字幕文本相關的表中的數據?包括節目,播放列表等...? – xQbert 2012-01-09 12:14:08

+0

我需要所有數據...包括節目,播放列表等= =) – errata 2012-01-09 12:15:47

回答

0

呃,不知何故,我設法檢索我需要的數據,但我不確定這是否是一種好方法,所以如果我在這裏犯了一些微不足道的錯誤,或者如果查詢可能以某種方式「簡化」,請糾正我。謝謝:)

SELECT st.line1, st.line2, st.line3, ii.title, pp.name, pp.time, ss.show_name, stxt.subtitle_text, stxt2.subtitle_text, stxt3.subtitle_text 

FROM subtitles st 

LEFT JOIN items_subtitles iss ON iss.subtitle_id = st.id 
LEFT JOIN items ii ON iss.item_id = ii.id 
LEFT JOIN items_playlists ipp ON ipp.item_id = ii.id 
LEFT JOIN playlists pp ON ipp.playlist_id = pp.id 
LEFT JOIN shows ss ON pp.name = ss.id 
LEFT JOIN subtitles_txt stxt ON st.line1 = stxt.id 
LEFT JOIN subtitles_txt stxt2 ON st.line2 = stxt2.id 
LEFT JOIN subtitles_txt stxt3 ON st.line3 = stxt3.id 

WHERE st.line1 = ANY (SELECT id FROM subtitles_txt WHERE subtitle_text LIKE 'some_query%') 
OR st.line2 = ANY (SELECT id FROM subtitles_txt WHERE subtitle_text LIKE 'some_query%') 
OR st.line3 = ANY (SELECT id FROM subtitles_txt WHERE subtitle_text LIKE 'some_query%')