Multi requête sql (avec 2 and et 1 or)

Résolu/Fermé
easyjava - 26 mars 2009 à 11:27
 easyjava - 26 mars 2009 à 12:38
Bonjour,
Voici mon problème :

J'ai deux conditions à respecter qui sont les suivantes :

`left` >= '".$dateLeft."' AND `back` <= '".$dateBack."'

`left` <= '".$dateLeft."' AND `back` >= '".$dateBack."'

J'ai bien essayé de faire quelque chose dans ce genre :

$connect = "SELECT * FROM `locations` WHERE `left` >= '".$dateLeft."' AND `back` <= '".$dateBack."' OR `left` <= '".$dateLeft."' AND `back` >= '".$dateBack."'";

mais cela ne fonctionne pas car mysql n'arrive pas à comprendre les deux conditions. Idéalement il faudrait pouvoir faire comme en math et utiliser des parenthèses mais ça ne fonctionne pas non plus.

Est ce que quelqu'un sait comment formuler cette "multi requête" ?

Merci d'avance et bonne journée à vous.

3 réponses

Enfait j'ai trouvé moi-même.

Ce n'était pas une erreur de parenthèses mais de logique tout simplement.

Si jamais voici la requête correcte :

$connect = "SELECT * FROM `locations` WHERE
(`left` <= '".$dateLeft."' AND `back` >= '".$dateBack."') OR
(`left` <= '".$dateLeft."' AND `back` >= '".$dateLeft."') OR
(`left` <= '".$dateBack."' AND `back` >= '".$dateBack."') OR
(`left` >= '".$dateLeft."' AND `back` <= '".$dateBack."')
";
1
freto Messages postés 1542 Date d'inscription vendredi 6 juillet 2007 Statut Membre Dernière intervention 8 avril 2016 162
26 mars 2009 à 11:37
Bonjour.
Et comme ceci:

$connect = "SELECT * FROM `locations` WHERE `left` >= '".$dateLeft."' OR `left` <= '".$dateLeft."' AND `back` <= '".$dateBack."' OR `back` >= '".$dateBack."'";

A moins que sémantiquement, cela ne colle pas. Sinon, avec un XOR

$connect = "SELECT * FROM `locations` WHERE `left` >= '".$dateLeft."' XOR `back` >= '".$dateBack."'";
0
Enfait je me suis mal exprimé, un exemple vaut mille mots.

J'ai dans ma base des enregistrements qui correspondent à des locations (avec une date de début et une date de fin).
Maintenant je code la page qui insère une nouvelle location. Je dois donc vérifier si les dates de la nouvelle location tombent en même temps que d'autres locations déjà enregistrées.
Il y a donc 4 conditions :
            Début de la loc existante            Fin de la loc existante
1          avant                                       après
2          avant                                       avant
3          après                                       après
4          après                                       avant

Dans ces 4 cas la nouvelle location est en même temps qu'une ancienne location et son id doit apparaitre.

J'ai donc essayé cette formule :
SELECT * FROM `locations` WHERE
(`left` <= '".$dateLeft."' AND `back` >= '".$dateBack."') OR
(`left` <= '".$dateLeft."' AND `back` <= '".$dateBack."') OR
(`left` >= '".$dateLeft."' AND `back` >= '".$dateBack."') OR
(`left` >= '".$dateLeft."' AND `back` <= '".$dateBack."')

Malheureusement elle me sort des id qui ne sont pas en même temps que la nouvelle location donc les parenthèses sont mal placées ou ne fonctionnent pas.
0