【问题标题】:MySQL search engine - AND keywordsMySQL 搜索引擎 - AND 关键字
【发布时间】:2011-09-21 22:13:41
【问题描述】:

我正在尝试在关键术语表和页面之间进行搜索查询。

考虑下表。

页数

page_id page_name 1 只猫 2 条狗 3人

关键词

key_id key_name key_page_id 1 块 1 2 笨蛋 1 3 领口 2 4 约翰 3 5 块 3

搜索词是 purz AND puzy 我希望查询结果只返回页面 id 1。

从页面、关键字中选择 page_id WHERE (key_name='purz OR key_name='puzy') AND key_page_id = page_id;

返回

page_id 1 3

我想要

page_id 1

因为只有 purz 和 puzy 都与 Cats 相关联。

【问题讨论】:

  • 另外我认为创建一个从关键字更新的临时关键字表可能更有效,我可以保证唯一性。我也在考虑这里的可扩展性。
  • 您不需要临时表,只需在 KEYWORDS 表中的 2 个字段上添加唯一索引:key_name 和 key_page_id。这将保证您没有两次为同一页面使用相同的关键字。更改表 KEYWORDS 添加唯一(key_namekey_page_id
  • 对不起,我知道我的例子是抽象的,可能没有指定这些重复关键字的需要

标签: mysql


【解决方案1】:
SELECT p.page_id, COUNT( key_id ) AS keyword_all
FROM PAGES p
JOIN KEYWORDS ON key_page_id = page_id
GROUP BY page_id
HAVING keyword_all = (
  SELECT COUNT( key_id ) AS found_k
    FROM KEYWORDS
    WHERE key_page_id = p.page_id
      AND (
      key_name = 'purz'
      OR key_name = 'puzy'
    )
  )

我在这里所做的是只获取关键字总数与我们查找的关键字相匹配的页面。

这样您就不需要多次加入。仅根据您要查找的关键字更改子查询中的 WHERE 条件。

【讨论】:

    【解决方案2】:

    不确定这是否真的有效,但您可以尝试为每个搜索词加入关键字表,例如:

    SELECT searchterm1.key_page_id as page_id FROM KEYWORDS searchterm1 
    INNER JOIN KEYWORDS searchterm2 
    ON (searchterm1.key_page_id = searchterm2.key_page_id) 
    WHERE searchterm1.key_name='purz' AND searchterm2.key_name='puzy';
    

    你甚至不需要加入 PAGES 表,除非你还需要返回 page_name

    【讨论】:

      【解决方案3】:

      我相信要做到这一点,您必须在关键字表上加入两次:

      SELECT p.page_id
      FROM pages p
      JOIN keywords k ON (k.key_page_id = p.page_id)
      JOIN keywords k2 ON (k2.key_page_id = p.page_id)
      WHERE k.key_name='purz'
          AND k2.key_name='puzy';
      

      【讨论】:

        猜你喜欢
        • 2012-10-30
        • 2011-08-24
        • 1970-01-01
        • 1970-01-01
        • 2011-07-24
        • 2011-10-15
        • 2021-06-30
        • 1970-01-01
        • 2016-10-12
        相关资源
        最近更新 更多