【问题标题】:LEFT JOIN MYSQL full text search - search multiple columns cross tableLEFT JOIN MYSQL全文搜索——跨表搜索多列
【发布时间】:2013-02-15 07:20:48
【问题描述】:

我有两张桌子:

表 1:内容 [标题、描述、url、genre_id] 表 2:流派 [genre_id,genre_name]

我正在尝试运行 FULL SEARCH 查询,以便如果有人搜索流派,将返回内容中的详细信息。同样,如果有人搜索标题,内容将正常返回。请注意,某些内容没有分配类型,因此需要在这种情况下工作。

这是我的查询 - 我只是不知道如何让它工作......

"SELECT content.*, genre.* FROM content LEFT OUTER JOIN genre 
ON (genre.genre_id=content.genre_id) 
WHERE MATCH (content.title, content.description) 
AGAINST ('$query') 
OR MATCH (genre.genre_name) 
AGAINST ('$query') 
AND content.url IS NOT NULL AND content.url <> '' LIMIT $lowerlimit, 10";

【问题讨论】:

  • 您的标题显示为 LEFT join,但您的代码显示为 INNER join,可能是这样吗?
  • 我很抱歉-我确实将其设置为 LEFT join,但一直在尝试多种选择!

标签: mysql search


【解决方案1】:

我不熟悉WHERE MATCH ** AGAINST **,但我相信它可以重写为:

SELECT content.*, genre.*
FROM content
LEFT OUTER JOIN genre 
    ON genre.genre_id = content.genre_id
WHERE (content.title LIKE '%' + '$query' + '%'
    OR content.description LIKE '%' + '$query' + '%'
    OR genre.genre_name LIKE '%' + '$query' + '%')
AND content.url IS NOT NULL
AND content.url <> ''
LIMIT $lowerlimit, 10;

我还在您的查询中注意到,在分号之前的末尾有一个额外的双引号。

【讨论】:

  • 嗯,如果我不使用通配符和查询之间的 + 符号,这将起作用 - 试图避免 LIKE,尽管我听说它有性能问题
【解决方案2】:

如果您有没有genre_id 的内容项目,那么INNER JOIN 不是要走的路。这将排除任何没有流派 ID 的内容项目。请改用 LEFT OUTER JOIN。这假设没有流派的流派 ID 没有相应的内容项。如果是后者,您需要在 Content 表中创建某种虚拟行来处理此问题。如果这没有意义,请告诉我,我会给你更多细节。

【讨论】:

  • 嗨 Melanie - 我现在使用了 LEFT OUTER JOIN,但你说得对,我可能有一些没有内容的类型 ID(我可以强迫这种情况不发生......)不幸的是查询仍然显示错误
猜你喜欢
  • 2010-11-10
  • 1970-01-01
  • 2023-01-13
  • 1970-01-01
  • 1970-01-01
  • 2012-02-19
  • 1970-01-01
  • 1970-01-01
  • 2019-03-07
相关资源
最近更新 更多