2012-01-09 122 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%')