Как создать мульти выбор с более чем 8 таблицами и особыми условиями - PullRequest
0 голосов
/ 27 декабря 2018

Я пытался создать поиск, в котором вы можете искать названия книг и фильмов на разных языках.Я уже пытался использовать UNION и UNION ALL, но это не работает, потому что мои основные таблицы имеют разное количество столбцов.Я также пробовал INNER JOIN и LEFT JOIN, но это также не работает, потому что он повторял некоторые заголовки, которые не должны повторяться, пока я использую цикл while.

movie
---------------------------------------------------------
movie_id|original_movie_title|serial_id|genre|type|aired|
---------------------------------------------------------
   1    |Harry Potter        |    1    | ... |... | ... |
   2    |Kimi No Na Wa       |    2    | ... |... | ... |
   3    |Avengers            |    3    | ... |... | ... |

book
--------------------------------------------------
book_id|original_book_title|serial_id|genre|aired|
--------------------------------------------------
   1   |GoT Fire & Blood   |    4    | ... | ... |
   2   |Kimi No Na Wa      |    2    | ... | ... |
   3   |The Jungle Book    |    5    | ... | ... |

movie_de                             movie_ru
------------------------------       ------------------------------
de_movie_id|movie_id|de_title|       ru_movie_id|movie_id|ru_title|
   1       |    1   |Harry Potter       1       |    1   |гарри поттер
   2       |    2   |Your Name          2       |    2   |Твоё имя

movie_jp                               movie_en
------------------------------         ------------------------------
jp_movie_id|movie_id|jp_title|         en_movie_id|movie_id|en_title|
   1       |    1   |ハリー・ポッターと    1        |    1   |Harry Potter    
   2       |    3   |アベンジャーズ        2       |    2    |Your Name.
   3       |    2   |君の名は。           3        |    3   |The Avengers

book_de                              book_ru
------------------------------       ------------------------------
de_book_id|book_id|de_title|         ru_book_id|book_id|ru_title|
   1      |    1  |GoT Feuer & Blut   1        |    1  |GoT огонь и кровь    
   2      |    2  |Your Name.         2        |    2  |Твоё имя
   3      |    3  |Das Dschungel B.                  

book_jp                              book_en
------------------------------       ------------------------------
jp_book_id|book_id|jp_title|         en_book_id|book_id|en_title|
   1      |  2   |君の名は。            1       |   1   |GoT Fire & Blood    
   2      |  1   |GoT 血と火            2       |   2   |Your Name.
                                       3       |   3   |The Jungle Book 

Теперь, если я вхожув моем поиске буква «о», я хочу, чтобы все языковые заголовки были перечислены и упорядочены по имени, но все языковые заголовки должны иметь одинаковую «базовую информацию» из основной таблицы.Поэтому, если я ищу «の», все названия с этим письмом должны быть перечислены, а рядом с ними должны стоять жанр и дата эфира, например:

Искал «o»

 - Harry Potter        |Genre:...  |Aired:...  (From movie_de)
 - Kimi No Na Wa       |Genre:...  |Aired:...  (From original_movie_title)
 - Your Name           |Genre:...  |Aired:...  (From book_en)
 - гарри поттер        |Genre:...  |Aired:...  (From movie_ru)
 - Your Name           |Genre:...  |Aired:...  (From movie_en)
 - The Jungle Book     |Genre:...  |Aired:...  (From original_book_title)
 - Harry Potter        |Genre:...  |Aired:...  (From movie_en)
 - Got Fire & Blood    |Genre:...  |Aired:...  (From book_en)
 - Got Feuer & Blut    |Genre:...  |Aired:...  (From book_de)

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Вам просто нужно выбрать правильное количество столбцов с непротиворечивыми именами, тогда UNION ALL должно работать без проблем.Небольшой пример ниже:

SELECT
    original_movie_title as title,
    genre, aired
FROM movie
WHERE original_movie_title LIKE '%o%'
UNION ALL
SELECT 
    title.de_title as title, 
    movie.genre, movie.aired
FROM movie_de as title
LEFT JOIN movie
ON title.movie_id = movie.movie_id
WHERE title.de_title LIKE '%o%'

Поскольку вы пометили MySQL, обратите внимание, что символы Unicode должны быть экранированы в вашем LIKE, что может стать сложным, и вам может понадобиться возиться с кодировкой.Если вы используете SQL Server / TSQL, вы можете использовать префикс N в ваших строках, чтобы указать NVARCHAR.

0 голосов
/ 27 декабря 2018

Я знаю JOIN и UNION работы.Тем не менее, я думаю, что вы должны создать кэшированную таблицу и выполнять поиск только по этой таблице.Вы можете создать таблицу со структурой, подобной этой:

search_data
------------------------------
type |id|language|title
------------------------------
book |1 |en      |GoT Fire & Blood
book |1 |jp      |GoT 血と火
movie|3 |en      |The Avengers
movie|3 |jp      |アベンジャーズ

Помните, что столбец title должен быть проиндексирован для полнотекстового поиска.Теперь вы можете выполнить поиск по столбцу title в search_data и получить сведения об элементе из исходной таблицы (books или movies) на основе столбцов type, id и language.Таблица search_data должна обновляться с помощью сценариев PHP, задания cron или триггеров MySQL при каждом обновлении таблиц.

...