如何创建一个具有8个以上表和特殊条件的multi-select

iqxoj9l9  于 2021-06-17  发布在  Mysql
关注(0)|答案(2)|浏览(507)

我试着创建一个搜索,你可以搜索不同语言的书和电影的名字。我已经试过使用 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”,我希望所有语言标题都按名称列出并排序,但是所有语言标题都应该具有主表中相同的“基本信息”。所以如果我要寻找“の" 所有带有这封信的标题都应该列出来,并且就在它们旁边,应该标明类型和播出日期,比如:
搜索“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)
vaj7vani

vaj7vani1#

我知道 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 列应为全文搜索编制索引。现在,你可以在 titlesearch_data 并从原始表中检索项目详细信息( books 或者 movies )基于 type , id 以及 language 柱。这个 search_data 每次更新表时,应该通过php脚本、cron作业或mysql触发器更新表。

f3temu5u

f3temu5u2#

您只需要选择正确数量的具有一致命名的列,然后 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。

相关问题