我目前有以下两个表:
CREATE TABLE files_list
(
'listid' INT,
'name' VARCHAR(25),
'synonym' VARCHAR(25),
'description' VARCHAR(25)
);
CREATE TABLE files_tags
(
'tag_name' VARCHAR(25),
'listid' INT
);
如果有人使用关键字“龙球”,目前,我使用以下查询来搜索my_list以查找可能的匹配项:
SELECT *
FROM files_list
WHERE name LIKE '%dragon%'
OR synonym LIKE '%dragon%'
OR description LIKE '%dragon%'
OR name LIKE '%ball%'
OR synonym LIKE '%ball%'
OR description LIKE '%ball%'
我不确定如何使用一个查询搜索两个表。我想向用户显示搜索结果中的以下数据:名称,同义词,描述和所有标签。
我的问题
1.有没有办法让当前的mysql查询更短?
2.如何将其与files_tags
表结合使用,
- 显示files_list
中匹配files_tags
而不是files_list
的行?
- 显示来自files_list
的{{1}} files_tags`中匹配的行?
答案 0 :(得分:1)
加入表格更有意义。
SELECT name, synonym, description, tag_name FROM `files_list` WHERE ( name LIKE '%dragon%' OR synonym LIKE '%dragon%' OR description LIKE '%dragon%' OR name LIKE '%ball%' OR synonym LIKE '%ball%' OR description LIKE '%ball%' )
OUTER JOIN files_tags on files_tags.listid = files_list.listid
OUTER JOIN
将确保选中所有代码,当每个ID有多个代码可用时,这会创建重复的行,唯一的区别是代码
答案 1 :(得分:0)
使用union实际获取每个联合查询所需的列时要小心。在这种情况下,子查询似乎更有意义:
SELECT name, synonym, description FROM files_list WHERE
name LIKE '%dragon%' OR synonym LIKE '%dragon%' OR description LIKE '%dragon%'
OR name LIKE '%ball%' OR synonym LIKE '%ball%' OR description LIKE '%ball%'
OR listid IN (SELECT listid FROM files_tags WHERE tag_name='dragon' OR tag_name='ball');
其他一些问题: 当你说你想要显示用户“所有标签”时,你的意思是给定listid存在的所有标签吗?或者只是匹配的那些?如果像“%dragon%”这样的描述,即使它不在file_tags中,龙也是你要返回的标签之一吗?