2009-09-06 12 views
0

Eh bien, j'essayais de sélectionner des lignes d'une table s'il n'y avait pas de lignes dans une autre table.Mysql, NOT EXISTS, SELECT

Ma requête initiale était:

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 

mais il échoue après.

J'ai fait quelques tests et raccourcies ma requête:

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

qui est censé sélectionner tout de jos_datsogallery comme 'EXISTS (SELECT 1)' est toujours vrai.

J'ai essayé phpMyAdmin:

1064 - Vous avez une erreur dans votre syntaxe SQL. Consultez le manuel correspond à votre version serveur MySQL pour la bonne syntaxe à utiliser près 'EXISTS (SELECT 1) LIMIT 0, 30' à la ligne 1

Qu'est-ce qui ne va pas?

version de MySQL: 4.0.27

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

Répondre

5

EXISTS est supporté seulement 4.1 et au-dessus - la documentation que vous Liées est une documentation combinée pour la version 4.0/4.1 de sorte qu'il peut induire en erreur à quelles versions soutiennent réellement le mot-clé.

Depuis que vous avez mis à jour votre question pour indiquer que vous utilisez la version 4.0.x, c'est pourquoi cela ne fonctionne pas pour vous.

2

Voici une autre façon de réaliser la même chose, sans utiliser 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 

l'aide d'une jointure gauche signifie la droite de la jointure (la partie jos_datsogallery_votes) est autorisé à ne pas trouver toutes les lignes tout en retournant un résultat. Lorsque le côté droit de la jointure n'est pas trouvé, ses colonnes auront toutes la valeur NULL, que vous pouvez vérifier dans la partie WHERE de la requête.

HTH

+0

Merci! Je vais l'essayer maintenant. – undsoft

1

Un peu en retard, mais je cherchais quelque chose de similaire et il pourrait être utile à quelqu'un d'autre. Une autre méthode consiste à utiliser un nombre dans la clause where. Ainsi, votre requête serait:

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