搜索两个表

时间:2009-01-24 22:27:05

标签: php mysql sql

我目前有以下两个表:

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`中匹配的行?

您可以在http://hsbsitez.com/

看到当前显示的结果

2 个答案:

答案 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中,龙也是你要返回的标签之一吗?