我有一个多输入搜索表单,它有 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
最佳答案
加入photoPeople
和people
表 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/