【问题标题】:PHP/MySQL Search Engine Query for keywords in a related tablePHP/MySQL 搜索引擎查询相关表中的关键字
【发布时间】:2021-06-30 21:54:08
【问题描述】:

我正在尝试为我的网站创建搜索功能。我有一个名为“发布”的主表,其中包含要搜索的所有主要页面。我有第二个表,名为releases_index,其中包含每个页面的关键字。

示例:

发布:

# releases_id, releases_title
'10001', 'Scarlet Witch'
'10002', 'Vision'

releases_index:

# index_id, index_releaseId, index_value
'1', '10001', 'Scarlet Witch'
'2', '10001', 'Television'
'3', '10001', 'WandaVision'
'4', '10002', 'Vision'
'5', '10002', 'Television'
'6', '10002', 'WandaVision'

我正在努力创建一个可以返回正确结果的 SQL 查询。例如,如果我在网站上搜索“猩红女巫”,我希望它返回 index_releaseId 10001。如果我搜索“猩红女巫 wandavision”,我也希望它返回这个。

最初我尝试使用类似下面的方法来执行此操作,但问题是它正在寻找包含整个搜索查询的行,而不是与所有查询词匹配的发布 ID。

WHERE index_value LIKE '%scarlet%' AND index_value LIKE '%witch%' AND index_value LIKE '%wandavision%'

谁能建议最好的方法是什么?我在 PHP 中使用 PDO/MySQL 执行此操作

【问题讨论】:

  • 你想要 100001 和 100002 以及所有其他至少有一个 seachwordsß
  • @nbk 这里没有 100001
  • 那是因为您使用AND 作为所有术语,因此它们必须匹配所有单词(不应为您的示例数据返回任何内容),尝试将其更改为OR 应该可以把戏
  • @jumper85 将返回与所有搜索词不匹配的版本 ID,这不是我想要的

标签: php mysql


【解决方案1】:

这是我用来实现此目的的版本:

     SELECT index_releaseId, GROUP_CONCAT(index_value) as idx_values
       FROM releases_index
   GROUP BY index_releaseId
     HAVING idx_values LIKE '%scarlet%'
        AND idx_values LIKE '%witch%'
        AND idx_values LIKE '%wandavision%'

旁注: GROUP_CONCAT 是供应商特定功能,仅在 MySQL/MariaDB 中可用

【讨论】:

  • 我认为这可能是在正确的轨道上,但是当我运行它时我没有得到任何结果
  • 你能告诉我你使用什么排序规则吗?这可能是区分大小写搜索的问题。
  • utf8_general_ci - 只是尝试了正确的案例,但仍然没有返回任何内容
  • 好的,那么区分大小写不是这里的问题,因为一般通常会忽略大小写
  • 现在应该可以了,问题是,Find_In_Set 寻找完全匹配,而猩红或女巫不是这种情况,因为在集合中只有猩红女巫存在
【解决方案2】:

当您搜索每个必须有效的搜索词时

CREATE TABLE table1 (
  `index_id` VARCHAR(3),
  `index_releaseId` VARCHAR(7),
  `index_value` VARCHAR(15)
);

INSERT INTO table1
  (`index_id`, `index_releaseId`, `index_value`)
VALUES
  ('1', '10001', 'Scarlet Witch'),
  ('2', '10001', 'Television'),
  ('3', '10001', 'WandaVision'),
  ('4', '10002', 'Vision'),
  ('5', '10002', 'Television'),
  ('6', '10002', 'WandaVision');
SELECT DISTINCT `index_releaseId`
 FROM table1 t1
 WHERE EXISTS(SELECT 1 FROM table1 WHERE `index_releaseId` = t1.`index_releaseId` AND  `index_value` LIKE '%Scarlet%') 
AND EXISTS(SELECT 1 FROM table1 WHERE `index_releaseId` = t1.`index_releaseId` AND  `index_value` LIKE '%Witch%') 
AND EXISTS(SELECT 1 FROM table1 WHERE  `index_releaseId` = t1.`index_releaseId` AND  `index_value` LIKE '%WandaVision%')
| index_releaseId | | :---------------- | | 10001 |

db小提琴here

【讨论】:

    猜你喜欢
    • 2012-10-30
    • 2011-08-24
    • 2011-09-21
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多