SQL - запутанный запрос - PullRequest
       2

SQL - запутанный запрос

1 голос
/ 08 октября 2011

У меня есть таблица 'photos':

photoID (INT), setID (INT)....
18900 , 234 , ...
18901 , 234 , ...
18902 , 234 , ...
18903 , 249 , ...
18904 , 249 , ...
18905 , 249 , ...

У меня также есть таблица 'photoKeyword':

photoID (INT), keywordID (INT)
18900 , 12
18900 , 21
18901 , 17
18905 , 26
18905 , 10

Как вы можете видеть из моих примеров выше, фотографии 18902,18903 и 18904 имеют НЕ , которые имеют какие-либо ключевые слова в таблице photoKeyword.Это именно то, что я пытаюсь установить.

Я пытаюсь составить список photoID, которые не имеют ключевых слов, но один setID за раз.Итак, как вы можете видеть, фотография 18902 не имеет ключевых слов, как и 18903 и 18904, но эти три фотографии имеют два разных setID.

Таким образом, выполнение этого запроса один раз должно вернуть только фотографию 18902. Я бы добавилключевые слова для этой фотографии, так что это не будет проблемой снова.При следующем запуске запроса он должен вернуть фотографии 18903 и 18904, следующий набор (setID: 249) фотографий, у которых нет ключевых слов.

Как это возможно?Можно ли просто использовать SQL?Я надеюсь, что вы можете понять, чего я хочу достичь, я потерял себя, просто написав об этом !!

Любые мысли с благодарностью приняты ...

Ответы [ 3 ]

0 голосов
/ 08 октября 2011
SELECT photoID
     , setID
FROM photos 
WHERE photoID NOT IN
      ( SELECT photoID
        FROM photoKeyword
      )
  AND setID =
      ( SELECT setID
        FROM photos 
        WHERE photoID NOT IN
             ( SELECT photoID
               FROM photoKeyword
             )
        ORDER BY setID 
        LIMIT 1
      )
0 голосов
/ 09 октября 2011

Это может быть то, что вам нужно, что довольно просто ... когда вы думаете об этом ... Убедитесь, что в таблице ключевых слов есть индекс для идентификатора фотографии

select
      p.PhotoID,
      p.SetID
   from
      Photos p
         LEFT JOIN photoKeyword pkey
            on p.PhotoID = pkey.PhotoID
   where 
      pkey.PhotoID = null

Выполнив левое соединение,мы знаем, что он всегда будет пытаться на второй стол.Затем, если во второй таблице нет совпадений, мы знаем, что ID, пытающийся присоединиться, будет нулевым ... Итак, оставляем соединение и возвращаем только те идентификаторы, для которых ответ равен NULL во второй таблице.

0 голосов
/ 08 октября 2011

1001 * попробовать *

SELECT X.photoID FROM photos X
INNER JOIN
(SELECT DISTINCT P.setID FROM 
photos P 
LEFT OUTER JOIN (SELECT K.photoID, COUNT(*) C FROM photoKeyword K GROUP BY K.photoID) KC ON KC.photoID = P.photoID
GROUP BY P.setID
HAVING SUM (KC.C) < 1) Y ON X.setID = Y.SetID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...