我正在尝试创建一个搜索,您可以在其中搜索不同语言的图书和电影名称。我已经尝试使用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)
发布于 2018-12-27 11:33:18
我知道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
列编制索引。现在,您可以在search_data
的title
列上进行搜索,并根据type
、id
和language
列从原始表(books
或movies
)中检索商品详细信息。search_data
表应该通过PHP脚本、cron作业或MySQL触发器在每次表更新时进行更新。
发布于 2018-12-27 11:34:36
您只需要选择具有一致命名的正确数量的列,那么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字符需要在您的代码中进行转义,这可能会变得复杂,您可能需要摆弄编码。如果您使用的是SQL Server / TSQL,则可以在字符串中使用N
前缀来表示NVARCHAR。
https://stackoverflow.com/questions/53938294
复制相似问题