«сложный» MySQL реляционный запрос БД - PullRequest
0 голосов
/ 09 января 2012

У меня нет большого опыта работы с реляционными базами данных, и я некоторое время борюсь с этой проблемой, но без особой удачи ...

Итак, у меня есть несколько таблиц:

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%').

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

1 Ответ

0 голосов
/ 06 февраля 2012

Э-э, каким-то образом мне удалось получить данные, которые мне нужны, но я не уверен, что это хороший способ, поэтому, пожалуйста, исправьте меня, если я допустил здесь несколько тривиальных ошибок или если запрос может быть как-то «упрощен».Спасибо:)

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%')
...