Получить строки MysQL, где совпадают 2 слова - PullRequest
3 голосов
/ 17 декабря 2010

Я пытаюсь создать простой поиск на основе таблиц 2 MySQL.Один из них назвал ключевые слова (слова), а другой назвал keyword2data (карта, которая связывает слова с источником данных).

Ключевые слова содержат идентификатор и ключевое слово, в то время как keys2data содержит ключевые слова_id и data_id.третья, но в данном случае неважная таблица.

Я хочу иметь возможность искать, например, "собачьи упряжки" и получать все data_id, с которыми связаны эти ключевые слова.

SELECT k2d.`data_id` , k2d.`keyword_id` 
FROM keywords2data as k2d, keywords as k 
WHERE k2d.`keyword_id` = k.`id` 
&& (k.`keyword` = 'dog' || k.`keyword` = 'sled') 
LIMIT 10

Дает мне все data_id, к которым привязана собака или сани, не обязательно оба, и это то, что я хочу.

SELECT k2d.`data_id` , k2d.`keyword_id` 
FROM keywords2data as k2d, keywords as k 
WHERE k2d.`keyword_id` = k.`id` 
&& (k.`keyword` = 'dog' && k.`keyword` = 'sled') 
LIMIT 10

Дает мне ничего, поскольку ни одна строка в keyword2data не содержит 2 ключевых слова.

Как правильно это сделать?

Ответы [ 3 ]

3 голосов
/ 17 декабря 2010

Как насчет чего-то вроде

SELECT  k2d.`data_id` , 
        k2d.`keyword_id`  
FROM    keywords2data as k2d INNER JOIN
        keywords as k  ON k2d.`keyword_id` = k.`id` INNER JOIN
        keywords as k2  ON k2d.`keyword_id` = k2.`id`
WHERE   k.`keyword` = 'dog' 
AND     k2.`keyword` = 'sled'
LIMIT 10 
2 голосов
/ 17 декабря 2010

Как насчет этого?

SELECT k2d.`data_id`, 
       k2d.`keyword_id` 
FROM   keywords2data AS k2d 
       INNER JOIN keywords AS k 
         ON k2d.`keyword_id` = k.`id` 
WHERE  k.`keyword` IN ( 'dog', 'sled', 'rex' ) 
GROUP  BY k.keyword 
HAVING COUNT(*) = 3 
1 голос
/ 17 декабря 2010

Возможно, это?

Чтобы расширить, чтобы соответствовать большему количеству ключевых слов, вы просто добавили бы больше слов в оператор OR в подзапросе и затем изменили =2.

ЭтоПредполагается, что каждый элемент данных связан с ключевым словом, используя kerywords2data один раз и только один раз.

SELECT k2d.data_id
     , k2d.keyword_id

FROM keywords2data AS k2d
   , keywords AS k 

WHERE k2d.keyword_id = k.id
  AND (
       SELECT COUNT(*)
        FROM keywords2data AS sqk2d
           , keywords AS sqk 
        WHERE sqk2d.data_id = k2d.data_id
          AND sqk2d.keyword_id = sqk.id
          AND (sqk.keyword = 'dog' || sqk.keyword = 'sled')
       ) = 2

LIMIT 10

Вот версия, которая не возвращает повторяющийся data_id (согласно комментариям), но также невообще не возвращать ключевые слова:

SELECT k2d.data_id

FROM keywords2data AS k2d

WHERE (
       SELECT COUNT(*)
         FROM keywords2data AS sqk2d
            , keywords AS sqk 
        WHERE sqk2d.data_id = k2d.data_id
          AND sqk2d.keyword_id = sqk.id
          AND (sqk.keyword = 'dog' || sqk.keyword = 'sled')
      ) = 2

LIMIT 10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...