MySQL 搜索连接查询

标签 mysql sql database search-engine

我有一个多输入搜索表单,它有 2 个文本框。一个文本框用于“searchWords”,另一个文本框用于“specificPeople”。

在第一个文本框中,您可能有“Dorchester Hotel London”,在第二个文本框中,您可能有“Brad Pitt/Angelina Jolie”。使用 ASP,我将第二个文本框值转换为我的 IN 子句将接受的格式,例如这个 ('Brad Pitt','Angelina Jolie')。

SELECT photoSearch.photoID, Left(photoSearch.caption,25), photoSearch.allPeople, photoSearch.allKeywords
FROM photoSearch
JOIN ( photoPeople INNER JOIN people ON photoPeople.peopleID = people.peopleID)
ON photoSearch.photoID = photoPeople.photoID AND people.people IN ('Brad Pitt','Angelina Jolie')
WHERE MATCH (caption, allPeople, allKeywords) AGAINST ('+dorchester +hotel' IN BOOLEAN MODE)
AND
photoSearch.dateCreated BETWEEN '2011-07-21' AND '2011-10-23'
ORDER BY photoSearch.dateCreated

这可以正常工作,但不会生成 Brad 和 Angelina 在一起的记录。它显示了 Brad 单独的记录和 Angelina 单独的记录。所以这是我第一次意识到 IN 子句的工作方式类似于 OR。

如何修改此查询以返回具有这两个特定名称而不是其中任何一个的行?

我的数据库看起来与此类似:

photoSearch
photoID     INT / AUTO / INDEX
caption     VARCHAR(2500) /  FULLTEXT
allPeople   VARCHAR(300) / FULLTEXT
allKeywords VARCHAR(300) / FULLTEXT
dateCreated DATETIME / INDEX

photoPeople
photoID     INT / INDEX
peopleID    INT / INDEX

people
peopleID    INT / INDEX
people      VARCHAR(100) / INDEX

感谢收到的任何帮助......一如既往:)


表格中的内容示例:

photoSearch
photoID     |       caption         |           dateCreated
1900                Dorchester Hotel...         2011-10-03

'photoPeople'
[photoID]       |   [peopleID]
1900                147
1900                148

'people'
[peopleID]      |   [people]
147                 Brad Pitt
148                 Angelina Jolie

最佳答案

加入photoPeoplepeople 表 n 次,其中 n 是您要搜索的人数:

SELECT photoSearch.photoID, Left(photoSearch.caption,25), photoSearch.allPeople, photoSearch.allKeywords 
FROM photoSearch 
JOIN ( photoPeople AS pp1 JOIN people AS p1 ON pp1.peopleID = p1.peopleID) 
ON photoSearch.photoID = pp1.photoID AND p1.people = 'Brad Pitt'
JOIN ( photoPeople AS pp2 JOIN people AS p2 ON pp2.peopleID = p2.peopleID) 
ON photoSearch.photoID = pp2.photoID AND p2.people = 'Angelina Jolie'
WHERE MATCH (caption, allPeople, allKeywords)
      AGAINST ('+dorchester +hotel' IN BOOLEAN MODE) 
AND photoSearch.dateCreated BETWEEN '2011-07-21' AND '2011-10-23' 
ORDER BY photoSearch.dateCreated 

关于MySQL 搜索连接查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7536444/

相关文章:

sql-server - 我可以在没有系统管理员的情况下连接到 SSMS 上的本地主机吗?

mysql - 最适合这项工作的 DBMS 是什么?

mysql - 检查rails中是否存在记录

mysql - 报告两年内逐月比较图表

mysql - 获取 MySQL 多行插入中的插入 ID

mysql - 在 DQL 查询中加入两个实体

mysql - 连接到 azure 的Mysql服务器

php - 在 NOW() 的一周内从数据库中获取行

mysql - 使用求和函数更新表时组函数的使用无效

sql - 如何从 sql 触发器启动用户脚本