Mysql,NOT EXISTS,SELECT

时间:2009-09-06 10:48:12

标签: sql mysql

好吧,如果另一个表中没有行,我试图从一个表中选择行。

我的原始查询是:

SELECT * FROM `jos_datsogallery` as a WHERE a.published = 1 
and a.approved=1 NOT EXISTS (SELECT * FROM `jos_datsogallery_votes`
As v WHERE v.vip=62 AND v.vpic=a.id) ORDER BY a.imgdate DESC

但它仍然失败。

我做了一些测试并将查询缩短为:

SELECT * FROM `jos_datsogallery` WHERE EXISTS (SELECT 1)

应该选择jos_datsogallery中的所有内容作为'EXISTS(SELECT 1)'始终为真。

我试过phpMyAdmin:

  

1064 - 您的SQL语法出错。检查手册   对应于您的MySQL服务器   用于正确语法的版本   'EXISTS(SELECT 1)LIMIT 0,30'附近   在第1行

怎么了?

MySQL版本:4.0.27

MySQL doc:http://dev.mysql.com/doc/refman/4.1/en/exists-and-not-exists-subqueries.html

3 个答案:

答案 0 :(得分:5)

EXISTS仅在4.1及更高版本中受支持 - 您链接的文档是4.0 / 4.1的组合文档,因此可能会误导哪些版本实际支持该关键字。

由于您更新了问题以表明您使用的是4.0.x,这就是为什么它不适合您。

答案 1 :(得分:2)

这是另一种可以实现相同目标的方法,而不使用NOT EXISTS

SELECT * FROM `jos_datsogallery` AS a 
LEFT JOIN `jos_datsogallery_votes` AS v ON v.vip=62 AND v.vpic=a.id
WHERE a.published = 1 AND
a.approved=1 AND
v.vip IS NULL
ORDER BY a.imgdate DESC

使用左连接意味着连接的右手(jos_datsogallery_votes部分)在返回结果时不允许找到任何行。如果未找到连接的右侧,则其列的值都将为NULL,您可以在查询的WHERE部分中检查这些值。

HTH

答案 2 :(得分:1)

有点晚了,但我正在寻找类似的东西,它可能对其他人有用。另一种方法是在where子句中使用count。所以,您的查询将是:

SELECT * FROM `jos_datsogallery` AS a 
WHERE a.published = 1 
AND a.approved=1 
AND (
    SELECT COUNT(*) FROM `jos_datsogallery_votes` AS v 
    WHERE v.vip=62 
    AND v.vpic=a.id
) = 0 
ORDER BY a.imgdate DESC
相关问题