好吧,如果另一个表中没有行,我试图从一个表中选择行。
我的原始查询是:
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
答案 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