Mysql 如何创建包含8个以上表格和特殊条件的multi-select
我试图创建一个搜索引擎,你可以用不同的语言搜索书籍和电影的名字。 我已经尝试过使用Mysql 如何创建包含8个以上表格和特殊条件的multi-select,mysql,sql,Mysql,Sql,我试图创建一个搜索引擎,你可以用不同的语言搜索书籍和电影的名字。 我已经尝试过使用UNION和UNION-ALL,但这不起作用,因为我的主表的列数不同。我还尝试了内部连接和左连接,但也不起作用,因为它重复了一些不应该重复的标题,而我正在使用while循环 movie --------------------------------------------------------- movie_id|original_movie_title|serial_id|genre|type|aired|
UNION
和UNION-ALL
,但这不起作用,因为我的主表的列数不同。我还尝试了内部连接
和左连接
,但也不起作用,因为它重复了一些不应该重复的标题,而我正在使用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”
我知道
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 |アベンジャーズ
请记住,应为
标题
列编制全文搜索索引。现在,您可以搜索搜索数据
的标题
列,并从原始表(书籍
或电影
)中检索项目详细信息基于类型
、id
和语言
列。搜索数据
表应通过PHP脚本更新,每次更新表时,cron作业或MySQL都会触发。您只需选择正确数量的列并使用一致的命名,然后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,请注意需要在LIKE中转义unicode字符,这可能会变得复杂,您可能需要修改编码。如果您使用的是SQL Server/TSQL,您可以在字符串中使用
N
前缀来表示NVARCHAR。听起来您使用UNION/UNION的方法是正确的所有的想法…为了避免使用不同数量的列,只需为其他表中的每一列选择null或空文字字符串,以填充列数较少的列。为什么不向我们展示您所尝试的方法呢?与我的响应相比,这是一种更好的方法。只是想注意,如果需要,您需要重新编码为UTF-8序列您将在标题栏上使用LIKE
搜索,如果您的英语/德语标题页设置为VARCHAR
,则应将其转换为NVARCHAR
。
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%'