Requete sur le résultat d'une requete

Résolu
AzRaElDGT Messages postés 57 Date d'inscription   Statut Membre Dernière intervention   -  
cchristian Messages postés 921 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

Peut on faire une requête sur le résultat d'une requête?

Par exemple ma 1er requête:

        $requete = 'SELECT *
        FROM site_resa
        WHERE \''.$date1.'\' BETWEEN date1 AND date2';


Puis sur le resultat de cette requete:

        $requete = 'SELECT *
        FROM site_resa
        WHERE baniere = "on"
        OR moteur = "on"
        OR aquereur = "on"';


Bon j'imagine que ça ne s'écrit pas comme ça, mais comment puis je faire?

Az

8 réponses

TankilyoraDbug Messages postés 985 Date d'inscription   Statut Membre Dernière intervention   219
 
désolé je suis HS mais comment avez vous appris à programmer ? J'aimerais apprendre. Avez vous des conseils à me donner ? Des livres sitees etc ?

Ce n'est pas la réponse que vous attendiez je suppose...
0
AzRaElDGT Messages postés 57 Date d'inscription   Statut Membre Dernière intervention   2
 
En effet, rien a voir avec ma question...

Tu aurais pu créer un nouveau sujet pour ça ...

Az
0
cchristian Messages postés 921 Date d'inscription   Statut Membre Dernière intervention   131
 
Bonsoir,

Je te réponds un peu au "feeling" car je connais SQL/DB2 uniquement, mais le relationnel .............. Essaie quelque chose comme cela :

$requete = 'SELECT *
FROM site_resa
WHERE ( \''.$date1.'\' BETWEEN date1 AND date2')
AND ( baniere = "on" OR moteur = "on" OR aquereur = "on"');

J'ai mis des parenthèses pour encapsuler les conditions, j'ignore si c'est le bon symbole
0
AzRaElDGT Messages postés 57 Date d'inscription   Statut Membre Dernière intervention   2
 
Merci de ton aide mais j'ai fini par trouver:

$requete1 = 'SELECT *
FROM site_resa
WHERE \''.$date1.'\' BETWEEN date1 AND date2
AND EXISTS (SELECT *
FROM site_resa
WHERE baniere = "on"
OR moteur = "on"
OR aquereur = "on")';

En faite j'avais la solution mais j'avais aussi un problème dans ma boucle

Code complet:

function date_fr_to_mysql($str)
{return preg_replace(
   '/([0-9]{2}).?([0-9]{2}).?([0-9]{4})/',
   '\\3-\\2-\\1',
   $str);}

$date_deb = $_POST['date1'];
$date_fin = $_POST['date2'];
$chk_ban  = $_POST['baniere'];
$chk_mot  = $_POST['moteur'];
$chk_aqu  = $_POST['aquereur'];

$date = date_fr_to_mysql($date_deb);
$date2 = date_fr_to_mysql($date_fin);
$date1 = $date;
$erreur = "";

//boucle sur le nobre de jours entre Date1 et Date2
while($date1<=$date2)
{
	//Ecriture de la requete
    	$requete1 = 'SELECT *
    	FROM site_resa
    	WHERE \''.$date1.'\' BETWEEN date1 AND date2
		AND EXISTS (SELECT *
					FROM site_resa
    				WHERE baniere = "on"
    				OR moteur = "on"
    				OR aquereur = "on")';
	//Envois de la requete	
		$requete = mysql_query($requete1)or die('Erreur SQL !<br>'.$requete1.'<br>'.mysql_error()); 
		while ($data=mysql_fetch_array($requete))
		{$baniere = $data[7];
		$moteur = $data[8];
		$aquereur = $data[9];
		}
		
	//Découpage de la date
			$chaine = $date1;
			$date_deb_exp = explode ("-", $chaine);
			$jour = $date_deb_exp[2];
			$mois = $date_deb_exp[1];
			$annee = $date_deb_exp[0];

	//Ajoute 1 jour
			$jour = $jour+1;
	//Formatage du nouveau jours sur 2 chiffres
	if ($jour<=9)
		$jour = "0".$jour;

	//formatage de la nouvelle date
		$date1 = $annee."-".$mois."-".$jour;

	//Si Date1 et Date2 ont le meme critére sur "on" on sort de la boucle, sinon on controle le jour suivant jusqu'a date2.
		If (($chk_ban == "on")&&($baniere == "on"))
            {$erreur = $date1."baniere";
			break;}
        If (($chk_mot == "on")&&($moteur == "on"))
            {$erreur = $date1."moteur";
			break;}
        If (($chk_aqu == "on")&&($aquereur == "on"))
            {$erreur = $date1."aquereur";
			break;}
}



Merci

Az
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
AzRaElDGT Messages postés 57 Date d'inscription   Statut Membre Dernière intervention   2
 
Résolu
0
cchristian Messages postés 921 Date d'inscription   Statut Membre Dernière intervention   131
 
Pour mon information personnelle, peux-tu me dire si tu obtiens le résultat atttendu avec cette requête ?
0
AzRaElDGT Messages postés 57 Date d'inscription   Statut Membre Dernière intervention   2
 
Apparament oui ;)

Az
0
cchristian Messages postés 921 Date d'inscription   Statut Membre Dernière intervention   131
 
Bonjour,

Je t'ai posé cette question car de mon côté j'ai fait un test (SQL/DB2) et le résultat obtenu ne semble pas cadrer avec l'énoncé formulé (une requête sur le résultat d'une requête).
En effet chez moi, le second SELECT explore toute la table pour rechercher les lignes satisfaisant aux conditions formalisées dans le 2em prédicat et ce, indépendamment de la condition (1er prédicat) formalisé dans le premier SELECT.

Si ce n'est déjà fait et si ma remarque t'interpelle, essaie de faire un jeu d'essais, avec la table concernée constituée de plusieurs lignes dont une (ligne au moins) qui satisfait aux conditions du 2em prédicat mais qui se trouve en dehors de la plage de sélection du 1er prédicat.

Je me trompe peut-être, encore une fois c'est du relationnel mais il peut exister des différences.
Je ne le pense pas, mais dans le doute je préfère d'en informer.

0
AzRaElDGT Messages postés 57 Date d'inscription   Statut Membre Dernière intervention   2
 
Je travail avec MySQL 4.1.9, j'ai lancé toute une série de test avec toute les conditions possible (soit 27) je pas eu le moindre problème...

Mais lors de mes recherches il semblerait que l'écriture des sous requêtes ai récemment changer avec MySQL.

Quand au résultat que je recherchais:

    	SELECT *
    	FROM site_resa
    	WHERE \''.site_resa.'\' BETWEEN date1 AND date2
		AND EXISTS (SELECT *
					FROM site_resa
    				WHERE baniere = "on"
    				OR moteur = "on"
    				OR aquereur = "on")


Dans l'ordre:
1 je sélectionne tous les champs de la table "site_resa"
2 je recherche tous les enregistrements dont "site_resa" est compris entre date1 et date2.
3 Parmi tous les enregistrement restant je recherche tous ceux qui ont baniere ou moteur ou aquereur sur "on".

Les parties 1 et 2 représente pour moi une 1er requête, la partie 3 une desième requête soit une sous-requête.

Toute fois y a dans mon code une petite erreur mais qui n'a rien a voir avec ça, c'est juste pour sortir de la boucle.

Voila tous ce que je peux te dire.

Az
0
cchristian Messages postés 921 Date d'inscription   Statut Membre Dernière intervention   131
 
D'accord, énoncé comme cela (points 1, 2 et surtout le 3).

Ce n'était pas ce que j'avais compris.
0