MySQL Search Join Query - PullRequest
       3

MySQL Search Join Query

2 голосов
/ 24 сентября 2011

У меня есть форма многократного ввода, которая имеет 2 текстовых поля.Одно текстовое поле для «searchWords», а другое для «specificPeople».

В первом текстовом поле может быть «Dorchester Hotel London», а во втором - «Брэд Питт / Анджелина Джоли».».Используя ASP, я преобразую значение второго текстового поля в формат, который будет принимать мое предложение IN, например, это ('Брэд Питт', 'Анджелина Джоли').

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

Это работает без ошибок, но этоне выпускает записи, в которых есть Брэд и Анджелина вместе.Это показывает записи одного Брэда и записи одной Анджелины.Так что именно здесь я впервые понял, что предложение 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

Ответы [ 2 ]

1 голос
/ 24 сентября 2011

Присоединяйтесь к таблицам 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 
0 голосов
/ 24 сентября 2011

Проблема в том, что предложение IN

AND people.people IN ('Brad Pitt','Angelina Jolie')

ищет точные совпадения, поэтому запрос выполняет именно то, что вы запрашиваете.Если бы вы сделали

AND (people.people LIKE '%Brad Pitt%' OR people.people LIKE '%Angelina Jolie%') 

, вы получите желаемый результат.Если вы хотите, вы можете использовать

AND instr('/Brad Pitt/Angel Jolie/','/'+people.people+'/') > 0

, вы можете получить ожидаемые результаты ..

Попробуйте это:

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