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

PHP & Base de données Discussion :

Afficher les éléments de droite avec RIGHT JOIN


Sujet :

PHP & Base de données

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 163
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 163
    Par défaut Afficher les éléments de droite avec RIGHT JOIN
    Bonjour à tous

    J'ai une grosse requete avec plein de jointure qui fonctionne très bien
    Code PHP : 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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    $sql_select ='SELECT fi.field_name, st.id_station, st.station_name, st.station_longname, se.sensor_name, se.sensor_longname, se.chart_pointStyle_id_chart_pointStyle, se.chart_pointRadius, se.chart_fill, se.chart_showLine, se.chart_borderWidth, se.chart_pointHoverRadius, se.id_sensor, stype.measure_unit, stype.id_sensor_type, stype.sensor_type_name,m.value, c.id_collection,c.ttn_m_time,
    		cs.chart_style_value, cp.chart_pointStyle_value,
    		col_bg.color_name as bg_color,col_bg.color_value as bg_color_value,
    		col_bd.color_name as bd_color,col_bd.color_value as bd_color_value
    		FROM fields AS fi
    		INNER JOIN stations AS st ON fi.id_field = st.fields_id_field
    		INNER JOIN sensors AS se ON st.id_station = se.stations_id_station
    		INNER JOIN sensor_types AS stype ON se.sensor_types_id_sensor_type = stype.id_sensor_type
    		INNER JOIN measures AS m ON se.id_sensor = m.sensors_id_sensor
    		INNER JOIN collections AS c ON m.collections_id_collection = c.id_collection
    		INNER JOIN chart_backgroundColor AS cbgc on cbgc.id_chart_backgroundColor=se.chart_backgroundColor_id_chart_backgroundColor
    		INNER JOIN colors AS col_bg on cbgc.colors_id_colors=col_bg.id_colors
    		INNER JOIN chart_borderColor AS cbdc on cbdc.id_chart_borderColor=se.chart_borderColor_id_chart_borderColor
    		INNER JOIN colors AS col_bd on cbdc.colors_id_colors=col_bd.id_colors
    		INNER JOIN chart_style AS cs on se.chart_style_id_chart_style = cs.id_chart_style
    		INNER JOIN chart_pointStyle AS cp on se.chart_pointStyle_id_chart_pointStyle = cp.id_chart_pointStyle
    		WHERE fi.id_field = '.$field.' AND se.sensor_active = 1 AND st.station_active = 1
    		'.$clauseAND2.'
    		ORDER BY c.ttn_m_time, se.sensor_longname, c.id_collection  ASC';
     
    	$sql_result = $connect->query($sql_select);
     
     
    	if($debug==true)
    	{
    		if($sql_result->num_rows>0){
     
    				$j=0;
     
    				// Collect the time of measures and the id of the two sensors
    				while($row = $sql_result->fetch_assoc())
    				{
    					echo '<pre>';
    					echo print_r($row);
    					echo '</pre>';
     
    					$j++;
     
    				}
    		}
     
    		$sql_result->data_seek(0);
    		echo "<hr>";
    	}
    ceci m'affiche ( je ne mets pas tous, car il y en a 16
    Array
    (
    [field_name] => hutins
    [id_station] => 1
    [station_name] => st-1
    [station_longname] => Station 1
    [sensor_name] => b1
    [sensor_longname] => Température bas
    [chart_pointStyle_id_chart_pointStyle] => 1
    [chart_pointRadius] => 1
    [chart_fill] => 0
    [chart_showLine] => 1
    [chart_borderWidth] => 1
    [chart_pointHoverRadius] => 13
    [id_sensor] => 1
    [measure_unit] => C
    [id_sensor_type] => 2
    [sensor_type_name] => te
    [value] => 18.0000
    [id_collection] => 50
    [ttn_m_time] => 2020-11-05 00:50:06
    [chart_style_value] => line
    [chart_pointStyle_value] => triangle
    [bg_color] => Red
    [bg_color_value] => 255, 99, 132
    [bd_color] => Red
    [bd_color_value] => 255, 99, 132
    )
    1

    Array
    (
    [field_name] => hutins
    [id_station] => 1
    [station_name] => st-1
    [station_longname] => Station 1
    [sensor_name] => b4
    [sensor_longname] => Température haut
    [chart_pointStyle_id_chart_pointStyle] => 4
    [chart_pointRadius] => 1
    [chart_fill] => 0
    [chart_showLine] => 1
    [chart_borderWidth] => 1
    [chart_pointHoverRadius] => 13
    [id_sensor] => 4
    [measure_unit] => C
    [id_sensor_type] => 2
    [sensor_type_name] => te
    [value] => 18.0000
    [id_collection] => 50
    [ttn_m_time] => 2020-11-05 00:50:06
    [chart_style_value] => line
    [chart_pointStyle_value] => cicle
    [bg_color] => Turquoise
    [bg_color_value] => 75, 192, 192
    [bd_color] => Turquoise
    [bd_color_value] => 75, 192, 192
    )
    1
    Le problème est qu'il va m'afficher les que si une station dont ses capteurs ont des mesures enregitrées dans la base de donnée
    INNER JOIN stations AS st ON fi.id_field = st.fields_id_field
    J'aimerais modifier ceci de manière que l'ID (st.id_station) soit aussi listé. J'ai 6 stations actifs pour le field qui a l'id 2 (fi.id_field) et trois stations ont des mesures.
    J'aimerias que toutes les stations actives soient aussi listée même si il n'y a pas encore de capteurs enregistrés et associés aux stations qui ne sont pas (encore) listée

    Par exemple

    Array
    (
    [field_name] => hutins
    [id_station] => 5
    [station_name] => st-5
    [station_longname] => Station 5
    )
    Ou s'il y a des capteurs associées mais pas encore de mesures, ceci devrait ressemblé à ceci (sans [value] => 18.0000)

    Array
    (
    [field_name] => hutins
    [id_station] => 1
    [station_name] => st-1
    [station_longname] => Station 1
    [sensor_name] => b4
    [sensor_longname] => Température haut
    [chart_pointStyle_id_chart_pointStyle] => 4
    [chart_pointRadius] => 1
    [chart_fill] => 0
    [chart_showLine] => 1
    [chart_borderWidth] => 1
    [chart_pointHoverRadius] => 13
    [id_sensor] => 4
    [measure_unit] => C
    [id_sensor_type] => 2
    [sensor_type_name] => te
    [id_collection] => 50
    [ttn_m_time] => 2020-11-05 00:50:06
    [chart_style_value] => line
    [chart_pointStyle_value] => cicle
    [bg_color] => Turquoise
    [bg_color_value] => 75, 192, 192
    [bd_color] => Turquoise
    [bd_color_value] => 75, 192, 192
    )
    J'ai essayé de modifier ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RIGHT JOIN stations AS st ON fi.id_field = st.fields_id_field
    sans succès.

    Dans l'alternative, je me demande si je ne devrais pas faire une autre requête qui va uniqument listé les stations su du genre

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $sql_select ='SELECT st.id_station FROM stations AS st
    		WHERE st.station_active = 1
    		ORDER BY st.id_station  ASC';
     
    	$sql_result = $connect->query($sql_select);

    Puis fusionner les résultats dans la construction de mon array que je vais devoir exploiter

    La seconde alternatice me semble bien plus simple à appliquer, mais si je peux tout faire dans la meme requete, ca serait aussi bien

  2. #2
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 247
    Par défaut
    Attention à ta clause where ... AND st.station_active = 1.... Le fait de tester une valeur sur un champ nécessite que ce champ ait déjà une valeur. Quand il s'agit d'un champ d'une jointure externe (left ou right), ça exclue de fait les résultats où cette jointure ne renvoie rien.
    Donc à faire un simple test, comme tu fais, sur un champ d'une table jointe par une jointure externe, la transforme implicitement en jointure interne (inner).

    Si tu veux retrouver ta jointure externe, il faut prendre en compte, dans le test, le cas aussi ou le champ est null car la jointure ne renvoie aucun résultat.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Afficher les éléments d'une liste avec un sub
    Par stracoma dans le forum VB.NET
    Réponses: 3
    Dernier message: 06/01/2015, 22h07
  2. Afficher les éléments de la suggestbox au clic
    Par mikees dans le forum GWT et Vaadin
    Réponses: 13
    Dernier message: 17/05/2011, 13h34
  3. Réponses: 15
    Dernier message: 26/04/2008, 16h07
  4. Réponses: 2
    Dernier message: 05/05/2007, 17h37
  5. Réponses: 2
    Dernier message: 27/12/2005, 20h09

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