IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

LIMIT dans une sous requête LEFT JOIN : la valeur n'est pas rendue


Sujet :

Requêtes MySQL

  1. #1
    Membre averti Avatar de ddaweb
    Homme Profil pro
    Webmaster amateur
    Inscrit en
    Janvier 2013
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Webmaster amateur
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2013
    Messages : 329
    Points : 429
    Points
    429
    Par défaut LIMIT dans une sous requête LEFT JOIN : la valeur n'est pas rendue
    Bonjour à tous,

    Je suis de retour pour une aide avec une requête.

    Lorsque j'ajoute le "LIMIT 1" dans la sous requête LEFT JOIN, je n'obtiens plus la date souhaitée (noté dans le code ci-dessous), mais le rendu est bien une seule valeur (ce qui est souhaité !).
    Si je retire ce "LIMIT 1", j'obtiens bien les dates, mais pour tous les cours suivits : mon but n'est d'avoir que le dernier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    $reponse_prop = mysqli_query($conn_cecs, "SELECT * 
    	FROM 02_prop prop
    		LEFT JOIN (
    			SELECT * FROM 00_compta_cours T1 INNER JOIN 00_compta_dates T2 ON T1.compta_cours_date_id=T2.compta_dates_id LIMIT 1
    			) cours 
    			ON prop.id_prop=cours.compta_cours_prop_id
    	WHERE p_reinscription>='$liste_alerte_date_debut_gb' && p_mail!='' && p_option3='non' 
    	ORDER BY id_prop DESC, compta_cours_date_id DESC") or die(mysqli_error($conn_cecs));
    while ($in=mysqli_fetch_array($reponse_prop)) { 
    	$alertes_membre_id=$in['id_prop']; // ----- Issus de la table 02_prop et ce qui suit
    	$alertes_membre_prenom=$in['p_prenom'];
    	$alertes_membre_nom=$in['p_nom'];
    	$alertes_membre_cotisation=$in['p_reinscription'];
    	$alertes_membre_abonnement=$in['p_abonnement'];
    	$alertes_membre_rc=$in['p_echeance'];
    	$alertes_dernier_cours_date=$in['compta_dates_date']; // ----- Issus de la table 00_compta_dates -> MON PROBLEME avec le LIMIT 1
    	$i ++;
     
    	print "- $i -> [$alertes_membre_id] $alertes_membre_prenom $alertes_membre_nom ($alertes_membre_cotisation) : $alertes_membre_abonnement - $alertes_membre_rc -  $alertes_dernier_cours_date<br />";
    }
    Le "print" ne me sert qu'à vérifier si le rendu est correct.

    Mes recherches n'ont pas encore abouties à une solution, je fais donc appel à vous.

    D'avance merci,
    DDA

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 340
    Points : 39 736
    Points
    39 736
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Votre besoin manque d'explications, quelle est la date que vous recherchez, la date maxi, mini autre...
    Selon le cas la solution n'est pas la même

    Si par exemple vous voulez la dernière date il faut utilser MAX ou NOT EXISTS+(subselect d'une date supérieure)

    En aucun cas LIMIT n'est la bonne solution

  3. #3
    Membre averti Avatar de ddaweb
    Homme Profil pro
    Webmaster amateur
    Inscrit en
    Janvier 2013
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Webmaster amateur
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2013
    Messages : 329
    Points : 429
    Points
    429
    Par défaut
    C'est la date MAX.
    En triant en DESC et ne prenant qu'une seule valeur, cela ne sait être que la MAX ... mais en effet je suis dedans, c'est donc clair pour moi.

    J'ai fait un essai avec "MAX(compta_dates_date)", mais sans trouver la solution.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    		LEFT JOIN (
    			SELECT *,MAX(compta_dates_date) FROM 00_compta_cours T1 INNER JOIN 00_compta_dates T2 ON T1.compta_cours_date_id=T2.compta_dates_id
    			) cours
    J'ai essayé en retirant " *, ", il y a alors des erreurs.
    J'avoue que je ne me suis pas plus penché que cela sur les erreurs, j'ai commencé la mise en page pour avancer (cette date n'intervient pas encore).

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    1) Il vaut mieux éviter la guerre des étoiles !

    2) En SQL, l'opérateur logique ET s'écrit AND et non pas && qui est celui du PHP.

    3) En SQL, l'opérateur de comparaison de différence s'écrit <> et non pas != qui est celui du PHP.

    4) Attention aux injections SQL !
    N'utilisez pas directement une variable PHP dans une requête SQL sans avoir contrôlé qu'elle est du bon type attendu.

    5) Utilisez vos alias de tables partout dans la requête.
    On ne sait pas si les colonnes p_reinscription, p_mail et p_option3 viennent de la table 02_prop prop ou de la sous-requête.

    6) Un code indenté et aéré est plus agréable à lire et à déboguer.

    Voici votre requête récrite avec une suggestion. Votre besoin n'étant pas explicite, difficile de vous aider efficacement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    $sql = "
    	SELECT /* les colonnes nécessaires et pas étoile ! */
    	FROM 02_prop prop
    	LEFT JOIN
    	(
    		SELECT /* les colonnes nécessaires et pas étoile ! */
    		FROM 00_compta_cours T1 
    		INNER JOIN 00_compta_dates T2 ON T1.compta_cours_date_id = T2.compta_dates_id
    	) cours 
    		ON prop.id_prop = cours.compta_cours_prop_id
    	WHERE p_reinscription >= '$liste_alerte_date_debut_gb' -- Utilisez un paramètre, préparez la requête et passez lui ensuite la valeur à l'aide de la variable
    		AND p_mail <> ''
    		AND p_option3 = 'non'
    	ORDER BY id_prop DESC, compta_cours_date_id DESC
    	/* Avez-vous essayé de mettre le LIMIT 1 ici ? */
    ";

Discussions similaires

  1. Ingres - limite dans une sous-requête
    Par raphoun07 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 16/08/2011, 17h05
  2. impossible d'utiliser LIMIT 1 dans une sous-requête
    Par Christophe Charron dans le forum Requêtes
    Réponses: 13
    Dernier message: 19/12/2009, 22h42
  3. Passer un paramètre dans une sous-requête
    Par Lucier dans le forum Langage SQL
    Réponses: 1
    Dernier message: 09/10/2007, 10h07
  4. Contourner le non-support de limit dans une sous-requête
    Par Christophe Charron dans le forum Requêtes
    Réponses: 7
    Dernier message: 04/09/2007, 10h45
  5. Ramener plusieurs champs dans une sous requête...
    Par David.V dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 12/01/2005, 07h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo