[RESOLU] Problème de redondances dans les résultats d'une requête

Eléphanteau du PHP | 23 Messages

24 sept. 2014, 19:09

Bonjour à tous,

J'ai besoin de votre aide car j'ai un problème de redondance des données extraites sur des tables que je n'arrive pas à résoudre avec SELECT DISTINCT ou GROUP BY. Ci-dessous le détail de mon projet :

Ma BDD est composée de 4 tables qui sont :

Table "installations" :

Code : Tout sélectionner

id site 1 site1 2 site2 3 site3
Table "materieltypea" :

Code : Tout sélectionner

MA_id MA_id_installations MA_nom 1 1 matériel A 1 2 2 matériel A 2 3 3 matériel A 3
Table "materieltypeb" :

Code : Tout sélectionner

MB_id MB_id_installations MB_nom 1 1 matériel B 1 2 1 matériel B 2 3 2 matériel B 3 4 3 matériel B 4 5 3 matériel B 5
Table "materieltypec" :

Code : Tout sélectionner

MC_id MC_id_installations MC_nom 1 2 matériel C 1 2 3 matériel C 2

Je souhaite récupérer les données de ces 4 tables dans 2 listes dynamiques liées avec Ajax. La première liste affiche les données de la table "installations" et en fonction de l'installation sélectionnée, la deuxième liste affiche les données correspondantes dans les 3 autres tables. En suivant un tutoriel trouvé sur le net, j'ai rencontré 2 erreurs.
Pour information, je ne peux pas regrouper les 3 tables matériels en 1 seule car ces tables ont chacune des caractéristiques propres et un nombre de colonnes différentes.

Ci-dessous le détail du code :

Code de la page "installations.php" :

[javascript]
<html>
<head>
<title>Choix du matériel</title>
<script type='text/javascript'>

function getXhr(){
var xhr = null;
if(window.XMLHttpRequest) // Firefox et autres
xhr = new XMLHttpRequest();
else if(window.ActiveXObject){ // Internet Explorer
try {
xhr = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
}
else { // XMLHttpRequest non supporté par le navigateur
alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
xhr = false;
}
return xhr;
}

/**
* Méthode qui sera appelée sur le click du bouton
*/
function go(){
var xhr = getXhr();
// On défini ce qu'on va faire quand on aura la réponse
xhr.onreadystatechange = function(){
// On ne fait quelque chose que si on a tout reçu et que le serveur est ok
if(xhr.readyState == 4 && xhr.status == 200){
leselect = xhr.responseText;
// On se sert de innerHTML pour rajouter les options a la liste
document.getElementById('materiels').innerHTML = leselect;
}
}

// Ici on va voir comment faire du post
xhr.open("POST","ajaxMateriels.php",true);
// ne pas oublier ça pour le post
xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
// ne pas oublier de poster les arguments
// ici, l'id de l'auteur
sel = document.getElementById('installations');
idinstallations = sel.options[sel.selectedIndex].value;
xhr.send("idInstallations="+idinstallations);
}
</script>
</head>
<body>
<form>
<fieldset style="width: 500px">
<legend>Liste liées</legend>
<label>Installations</label>
<select name='installations' id='installations' onchange='go()'>
<option value='-1'>Aucun</option>
<?php
mysql_connect("localhost","root","root");
mysql_select_db("test");
$res = mysql_query("SELECT * FROM installations");
while($row = mysql_fetch_assoc($res)){
echo "<option value='".$row["id"]."'>".$row["site"]."</option>";
}
?>
</select>
<label>Matériels</label>
<div id='materiels' style='display:inline'>
<select name='materiels'>
<option value='-1'>Choisir un site</option>
</select>
</div>
</fieldset>
</form>
</body>
</html>
[/javascript]

Code de la page "ajaxMateriels.php" :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Document sans titre</title>
</head>

<body>

<?php
	echo "<select name='materiels'>";
	if(isset($_POST["idInstallations"])){
		mysql_connect("localhost","root","root");
		mysql_select_db("test");
		$res = mysql_query("SELECT * FROM materieltypea, materieltypeb, materieltypec WHERE MA_id_installations=".$_POST["idInstallations"]." AND MB_id_installations=".$_POST["idInstallations"]." AND MC_id_installations=".$_POST["idInstallations"]."");
		while($row = mysql_fetch_assoc($res)){
			echo "<option value='".$row["MA_id"]."'>".$row["MA_nom"]."</option>";
			echo "<option value='".$row["MB_id"]."'>".$row["MB_nom"]."</option>";
			echo "<option value='".$row["MC_id"]."'>".$row["MC_nom"]."</option>";
		}
	}
	echo "</select>";
?>
</body>
</html>

La liste "installations" fonctionne correctement et tous mes sites sont listés. Par contre, j'obtiens les résultats suivants sur la deuxième liste :
  • Si je sélectionne "site 1", je n'ai aucun résultat qui s'affiche. Vu que j'appelle la table "materieltypec" et qu'il n'y a pas de liaison pour ce matériel avec le site1, ça doit me générer une erreur...
  • Si je sélectionne "site 2", les résultats obtenus sont :
- Matériel A 2
- Matériel B 3
- Matériel C 1
==> pas de soucis
  • Si je sélectionne "site 3", les résultats obtenus sont :
- Matériel A 3
- Matériel B 4
- Matériel C 2
- Matériel A 3
- Matériel B 5
- Matériel C 2
==> redondances

Je souhaiterais que les résultats soient :

Site 1 :
- Matériel A 1
- Matériel B 1
- Matériel B 2

Site 2 :
- Matériel A 2
- Matériel B 3
- Matériel C 1

Site 3 :
- Matériel A 3
- Matériel B 4
- Matériel B 5
- Matériel C 2


Merci d'avance pour votre aide à un débutant dans le domaine ;)
Bonne soirée

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

24 sept. 2014, 23:34

salut,

a priori tu réalise un produit cartésiens sur les tables.

une jointure plus "correcte" pour être une solution.

si tu as trois tables, pourquoi ne pas faire simplement 3 select ?

coté technique ce genre de chose ne va pas chercher du html.
tu créer un web service qui va te retourner du JSON que tu vas utiliser pour alimenter les listes déroulantes.
Dans ce cas tu va pouvoir faire 3 select et retourner un tableau qui contient trois tableaux qui contiennent les données de chaque liste.


pour t'y aider je t'invite à utiliser un framework JS comme jQuery (ou extjson autre qui te convient).

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 23 Messages

25 sept. 2014, 12:02

Salut,

Merci pour ta réponse mais mon niveau ne me permet pas de mettre en œuvre ton explication et je n'ai pas le temps et la nécessité d'apprendre en détail ces langages. Je pensais qu'une petit modification dans mes requêtes aurait résolu mon problème mais apparemment c'est plus complexe que ça.

Actuellement mon site fonctionne donc tant pis si je n'arrive pas à réaliser ces listes déroulantes. C'était juste pour rendre plus agréable et plus simple la navigation grâce à des menus déroulants liés.

Merci quand même pour tes compléments.
A+

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

26 sept. 2014, 20:32

ben fait trois select.


@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 23 Messages

29 sept. 2014, 09:51

Bonjour,

J'ai obtenu la réponse à mon problème en utilisant la commande "UNION". Ci-dessous l'aide que l'on m'a apporté si ça peut aider quelqu'un :
SELECT 
MA_nom AS nom
FROM materieltypea
WHERE MA_id_installations="3"
 
UNION
 
SELECT 
MB_nom AS nom
FROM materieltypeb
WHERE MB_id_installations="3"
 
UNION
 
SELECT 
MC_nom AS nom
FROM materieltypec
WHERE MC_id_installations="3"
Encore merci aux différentes réponses apportées à ma demande.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

29 sept. 2014, 16:27

Modération :
Si ta question est résolue, pense à l'indiquer pour que les futures personnes qui voudront consulter ce sujet sachent qu'il contient une solution.
Tu peux réaliser cette opération toi-même en cliquant sur le bouton vert "Mettre le sujet en tant que Résolu" situé en haut de la page à côté du titre du sujet.
Il en faut peu pour être heureux ......