我如何使这个MySQL查询工作?

时间:2010-01-21 00:15:06

标签: sql mysql

我有一张名为'bandsplusrating'的表和一张名为'rating'的表 表'bandsplusrating'充满了乐队,表'评级'开始为空。

两个表都有一个名为'naam'的字段,可以将它们连接起来。 表'评级'有一个名为'fullname'的字段

每个频段的多个评级(bandsplusrating)将存储在表'评级'中

现在我要显示来自'bandsplusrating'的所有记录,这些记录没有被给定用户评级(ratings.fullname)

SELECT b.naam, b.stijl
FROM bandsplusrating b
LEFT JOIN ratings r ON b.naam = r.naam
WHERE r.fullname NOT LIKE 'Obama'

当其他用户对其进行评分时,此查询仍会显示记录。

我现在已经好几天了,有人可以帮助我吗?

谢谢!

3 个答案:

答案 0 :(得分:5)

SELECT    b.naam, b.stijl
FROM      bandsplusrating b
LEFT JOIN ratings r 
ON        b.naam  = r.naam
AND       'Obama' = r.fullname
WHERE     r.naam IS NULL

诀窍是,在WHERE之前评估LEFT JOIN。因此,首先让联接推出,任何来自bandplusrating的行与评级中的任何内容都不匹配将产生评级的空白记录(仅具有NULL值的评级记录)。然后,您可以使用WHERE对其进行过滤,并要求评级IS NULL中的某些已知必填列,您实际上是在说:只有那些不匹配的列。

编辑:

我刚看到OMG小马的全面答复,并决定添加另一种方法,这只是LEFT JOIN解决方案的一个小变化:

SELECT    b.naam, b.stijl
FROM      bandsplusrating b
LEFT JOIN ratings r 
ON        b.naam  = r.naam
AND       'Obama' = r.fullname
GROUP BY  b.naam, b.stijl
HAVING    COUNT(r.naam) = 0

(就我个人而言,我觉得这个不如前一个好)

答案 1 :(得分:4)

使用NOT IN:


SELECT b.naam,
       b.stigl
  FROM BANDPLUSRATING b
 WHERE b.naam NOT IN (SELECT r.naam
                        FROM RATINGS r
                       WHERE r.fullname LIKE 'Obama')

使用NOT EXISTS:


SELECT b.naam,
       b.stigl
  FROM BANDPLUSRATING b
 WHERE NOT EXISTS(SELECT NULL
                    FROM RATINGS r
                   WHERE r.naam = b.naam
                     AND r.fullname LIKE 'Obama')

使用LEFT JOIN / IS NULL:


   SELECT b.naam,
          b.stigl
     FROM BANDPLUSRATING b
LEFT JOIN RATINGS r ON r.naam = b.naam
                   AND r.fullname LIKE 'Obama'
    WHERE r.naam IS NULL

效果


Of the three options, the NOT IN and LEFT JOIN/IS NULL perform equallyNOT EXISTS表现不佳。

答案 2 :(得分:0)

my question here的答案可能对你有所帮助(有一些额外的解释可以进一步澄清罗兰的答案)。