【问题标题】:Searching two tables搜索两个表
【发布时间】:2009-01-24 22:27:05
【问题描述】:

我目前有以下两张表:

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 中与files_list, but may not infiles_tags 匹配的行?

您可以在http://hsbsitez.com/查看当前显示的结果

【问题讨论】:

标签: php mysql sql


【解决方案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 有多个标签可用时创建重复的行,唯一的区别是标签

【讨论】:

    【解决方案2】:

    在使用联合实际获取每个联合查询所需的列时要小心。而在这种情况下,子查询似乎更有意义:

    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 中,dragon 是您想要返回的标签之一吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多