SQL - 令人困惑的查询

时间:2011-10-08 14:05:00

标签: mysql sql

我有一张'照片'表:

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 NOT 在photoKeyword表中有任何关键字。这正是我想要建立的。

我正在尝试生成一个photoID列表,该列表没有关键字,但一次只有一个setID。你可以看到,照片18902没有关键字,18903和18904也没有,但这三张照片有两个不同的setID。

所以运行此查询一次,应该只返回照片18902.然后我会在此照片中添加关键字,这样就不会再出现问题了。下次我运行查询时,它应该返回照片18903和18904,下一组(setID:249)没有关键字的照片。

这怎么可能?是否可以只使用SQL?我希望你能理解我想要实现的目标,我只是在写这篇文章而迷失自我!!

感激不尽的任何想法......

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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
      )

答案 2 :(得分:0)

这可能就是你需要的东西,这很简单......当你想到它时......确保你的关键字表上有照片id的索引

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

通过执行LEFT连接,我们知道它将始终尝试第二个表。然后,如果第二个表没有匹配项,我们知道尝试加入的ID将为null ...因此,左连接并仅返回第二个表中答案为NULL的那些ID。