8721 sujets

Développement web côté serveur, CMS

Bonjour, je tourne en rond Smiley decu

Je fait une simple requête ci jointe
SELECT * FROM offre WHERE ligne = 'oui' AND reg='1' AND dep='67'

je cherche à insérer NOT EXISTS du moins je pense que c'est cela !

Mon but c'est que si cette requête n'a pas de réponse qu'elle enlève le reg='1' & dep='67'

J'ai testé cela mais ça ne marche pas Smiley decu
SELECT * FROM offre WHERE ligne = 'oui' AND reg='1' AND dep='67' NOT EXISTS (SELECT * FROM offre WHERE ligne = 'oui') 

Merci
Modifié par bibi67 (26 Nov 2015 - 17:18)
oui Not exist existe ^^

SELECT * 
FROM offre 
WHERE ligne = 'oui' AND 
NOT EXISTS
        (
        SELECT  * 
        FROM    offre
        WHERE reg='1' AND dep='67'
        )

Modifié par JENCAL (26 Nov 2015 - 17:19)
Modérateur
Salut,

En lisant ton code en Z, est ce que cela t'aide :

SELECT
    *
FROM
    offre
WHERE
    ligne = 'oui'
AND
    reg='1'
AND
    dep='67'
AND
    ligne NOT IN('oui')


ou

SELECT
    *
FROM
    offre
WHERE
    reg='1'
AND
    dep='67'

Modifié par niuxe (26 Nov 2015 - 17:25)
Hello merci pour les réponses mais cela ne marche pas pour moi

requête plus simple
SELECT * FROM offre WHERE id_offre = '20' AND NOT EXISTS ( SELECT * FROM offre WHERE reg = '5' )

Explication de mon but : si id_offre 20 n'existe pas on affiche alors les offres de la reg = 5
Modérateur
bibi67 a écrit :

Explication de mon but : si id_offre 20 n'existe pas on affiche alors les offres de la reg = 5


case ?
<<<EDIT
Sinon ceci ?

SELECT
    *
FROM
    offre
WHERE
    id_offre <> 20
AND
    reg = 5

EDIT;
Modifié par niuxe (26 Nov 2015 - 19:09)
a écrit :
Explication de mon but : si id_offre 20 n'existe pas on affiche alors les offres de la reg = 5


J'ai des sérieux doutes quant à la performance de cette requête, mais si tu tiens à le faire en une seule fois tu peux essayer quelque chose comme ça :


select *,
not exist (select * from offres where id_offre = 20) as ok
from offres
where id_offre=20 or (ok and reg=5)


Au niveau des performances, les or sont connus pour ne pas être les plus rapides car difficilement optimisables par les algorithmes de sélection, et pour le not exist il faut juste espérer que le moteur soit assez intelligent pour remarquer que la requête est constante et qu'il peut ne l'exécuter qu'une seule fois (Oracle doit sûrement être assez malin, mais peut-être pas MySQL).

Je pense que tu obtiendras de bien meilleurs résultats avec deux requêtes :


select * from offres where id_offre = 20


Puis en fonction du résultat, si nécessaire :

select * from offres where reg = 5


Qui sont toutes deux des requêtes très simples et donc particulièrement rapides s'il y a des index sur les deux colonnes.

Il faut savoir ne pas être trop gourmand et vouloir tout exécuter en une seule requête. Parfois, comme ici, ça simplifie grandement le problème, autant pour ta compréhension personnelle de la logique du système que pour le moteur SQL !
Modifié par QuentinC (27 Nov 2015 - 08:07)
J'aurai tendance a être d'accord avec la réponse précédente de faire en 2 requêtes simples mais bon, si pour une raison tu ne peux pas...

Je crois que tu fais à l'envers en fait. Si il n'y a pas de résultat au truc complet,alors tu fais la requête juste avec oui ce qui donne :

SELECT * FROM offre WHERE ligne = 'oui' 
AND NOT EXISTS (SELECT * FROM offre WHERE ligne = 'oui' AND reg='1' AND dep='67') //si il n'y a pas de résultat a cette sous requête, alors on fait juste la requête avec ligne='oui'

Je n'ai pas test, mais ca me semble plus logique

et ensuite je dirais un simple union avec celle de base pour avoir un résultat dans tous les cas : soit la 1ere renvoie un résultat et du coup la 2e ne retourne rien grâce au not exist, soit la 1ere ne retourne rien et donc la 2e sera exécutée ..

SELECT * FROM offre WHERE ligne = 'oui' AND reg='1' AND dep='67'
UNION
SELECT * FROM offre WHERE ligne = 'oui' 
AND NOT EXISTS (SELECT * FROM offre WHERE ligne = 'oui' AND reg='1' AND dep='67') //si il n'y a pas de resultat a cette sous requete, alors on fait juste la requete avec ligne='oui'

Je ne sais pas trop si il faut un jeu de parenthèse autour des selects pour faire un union, je crois que non mais je n'ai pas test ^^
Modifié par mathieu1004 (27 Nov 2015 - 15:13)