“复杂”的MySQL的关系数据库查询
问题描述:
我没有很多的关系数据库的经验,我这个问题一段时间,但有一点运气挣扎......“复杂”的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.line1
,subtitles.line2
和subtitles.line3
各自对应于subtitles_txt.id
。
我需要的是基于subtitles_txt.subtitle_text
值获得所有表中的所有行,条件是该值在右侧具有通配符(...WHERE subtitle_text LIKE 'value%'
)。
我觉得很遗憾我不能改变表的结构,因为这是一些大项目的一部分,很多其他的事情都取决于一些这些表的,所以我真的应该做一些查询出这...
答
呃,不知何故,我设法检索我需要的数据,但我不确定这是否是一种好方法,所以如果我在这里犯了一些微不足道的错误,或者如果查询可能以某种方式“简化”,请纠正我。谢谢:)
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%')
“要获取所有行”......所有的行?只有那些在subtitles.text或所有与字幕文本相关的表中的数据?包括节目,播放列表等...? – xQbert 2012-01-09 12:14:08
我需要所有数据...包括节目,播放列表等= =) – errata 2012-01-09 12:15:47