Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/01/2012, 20h10   #1
Invité de passage
 
Inscription : novembre 2008
Messages : 24
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 24
Points : 0
Points : 0
Par défaut Recherche multicritères sur plusieurs tables

Bonsoir,
J'ai un formulaire de recherche multicritères contenant des boutons radio et des cases à cocher, il va piocher dans plusieurs tables pour afficher les résultats selon le choix des critères.
J'ai une table "appartements", une table "maisons", une table "transactions" (Acheter ou Louer), une table "themes" (appartement, maison) et une table "pieces" (T1, T2, T3, T4, T5).
Les tables "appartements" et "maisons" contiennent toutes les deux des clès étrangères pour faire le lien avec les autres table, à savoir, "transactionID", "rubriqueID" et "piecesID"
Ce que je veut, c'est l'orsqu'on coche par exemple le bouton Acheter, la case Appartement et la case T1, il va questionner la table appartement pour sortir les critères demandés, la même chose si on coche la case maison.
Voilà le code que j'ai écrit et qui ne marche pas encore:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
SELECT r.theme, a.Reference,  p.nombre, t.ID
FROM transactions t  INNER JOIN appartements a ON a.transactionID=t.ID
WHERE a.transactionID=colbien  INNER JOIN rubriques r ON a.rubriqueID=r.ID WHERE a.rubriqueID=coltheme INNER JOIN pieces p ON a.piecesID=p.ID WHERE a.piecesID=colnombre
union ALL
SELECT r.theme, m.Reference,  p.nombre, t.ID
FROM transactions t  INNER JOIN maisons m ON m.transactionID=t.ID
WHERE m.transactionID=colbien  INNER JOIN rubriques r ON m.rubriqueID=r.ID WHERE m.rubriqueID=coltheme INNER JOIN pieces p ON m.piecesID=p.ID WHERE m.piecesID=colnombre
 
colbien=$_GET['transactionID']
coltheme=$_GET['rubriqueID']
colpieces[$_GET['piecesID']
Merci
bili31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2012, 08h26   #2
Membre actif
 
Inscription : janvier 2012
Messages : 117
Détails du profil
Informations forums :
Inscription : janvier 2012
Messages : 117
Points : 173
Points : 173
Juste comme ça, le champ Reference (pour M et A) est il bien défini à l'identique? Sinon quelle est la sortie et quel est l'éventuel message d'erreur?
KookieMonster est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2012, 09h15   #3
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 099
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 099
Points : 1 929
Points : 1 929
Bonjour,
La requête ne "fonctionne" pas car elle est syntaxiquement incorrecte.
Dans une jointure, il faut utiliser ON, et non WHERE pour spécifier les conditions:
Code SQL :
1
2
3
4
5
6
7
8
9
 
 
SELECT r.theme, a.Reference,  p.nombre, t.ID
FROM transactions t
INNER JOIN appartements a ON a.transactionID=t.ID AND a.transactionID=colbien
INNER JOIN rubriques r ON a.rubriqueID=r.ID AND a.rubriqueID=coltheme
INNER JOIN pieces p ON a.piecesID=p.ID AND a.piecesID=colnombre
union ALL
...

Je ne sais pas quel langage tu utilises, mais je pense que ce dernier peut te renvoyer le message d'erreur retourné par la base de données. Celui-ci t'aurai certainement indiqué la cause de l'erreur.

Tatayo.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2012, 21h09   #4
Invité de passage
 
Inscription : novembre 2008
Messages : 24
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 24
Points : 0
Points : 0
Merci beaucoup pour la réponse. En faite je n'est pas de message d'erreur simplement rien ne s'affiche sur ma page résultats.
j'ai modifié mon code entre temps, j'obtiens des résultats, par contre si je coche appartements et maisons en même temps il m'affiche que les résultats de maisons.
pareil, quand je coche T1, T2 ensemble, il m'affiche que les T2.
Voilà le code que j'ai utilisé:
Code :
1
2
3
4
 
SELECT a.rubriqueID , a.transactionID, a.piecesID, a.Reference,  a.Libelle FROM appartements a WHERE a.rubriqueID =coltheme AND a.transactionID=colbien AND a.piecesID=colnombre UNION ALL  SELECT m.rubriqueID , m.transactionID, m.piecesID, m.Reference, m.Libelle
FROM maisons m
WHERE m.rubriqueID =coltheme AND m.transactionID=colbien AND m.piecesID=colnombre
Je vais tester ton code pour voir ce que ca donne et je reviens.
Merci
bili31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2012, 21h29   #5
Invité de passage
 
Inscription : novembre 2008
Messages : 24
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 24
Points : 0
Points : 0
Je reviens vers toi tatayo, voilà le message d'erreur après avoir testé ton code:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LIMIT 0, 30' at line 3
Je suis sur php Myadmin version 5.0.5
bili31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2012, 09h35   #6
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 099
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 099
Points : 1 929
Points : 1 929
Sans la requête ni le code qui l'utilise, difficile de savoir ce qui ne va pas.
Par exemple l'erreur fait mention de la clause Limit, que je ne vois nul part...
A quoi correspond colbien, colnombre, coltheme ? Si ce sont des critères renseignés par l'utilisateur, que contiennent-ils quand l'utilisateur ne renseigne rien ?

Tatayo.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2012, 11h48   #7
Invité de passage
 
Inscription : novembre 2008
Messages : 24
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 24
Points : 0
Points : 0
Voilà le code que j'utilise avec la requête
Code :
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
 
<?php require_once('Connections/ConnexionBoutiquedream.php'); ?>
 
<?php  
IF(!isset($_GET['rubriqueID'])) $_GET['rubriqueID']=""; 
IF(!isset($_GET['transactionID'])) $_GET['transactionID']="2"; 
IF(!isset($_GET['piecesID'])) $_GET['piecesID']="";
?>
<?php
 
IF (!function_exists("GetSQLValueString")) {
FUNCTION GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") 
{
  IF (PHP_VERSION < 6) {
    $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;
  }
 
  $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);
 
  switch ($theType) {
    case "text":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;    
    case "long":
    case "int":
      $theValue = ($theValue != "") ? intval($theValue) : "NULL";
      break;
    case "double":
      $theValue = ($theValue != "") ? doubleval($theValue) : "NULL";
      break;
    case "date":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;
    case "defined":
      $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
      break;
  }
  RETURN $theValue;
}
}
 
mysql_select_db($database_ConnexionBoutiquedream, $ConnexionBoutiquedream);
$query_rsTheme = "SELECT * FROM rubriques ORDER BY theme ASC";
$rsTheme = mysql_query($query_rsTheme, $ConnexionBoutiquedream) OR die(mysql_error());
$row_rsTheme = mysql_fetch_assoc($rsTheme);
$totalRows_rsTheme = mysql_num_rows($rsTheme);
 
$maxRows_rsCatalogue = 5;
$pageNum_rsCatalogue = 0;
IF (isset($_GET['pageNum_rsCatalogue'])) {
  $pageNum_rsCatalogue = $_GET['pageNum_rsCatalogue'];
}
$startRow_rsCatalogue = $pageNum_rsCatalogue * $maxRows_rsCatalogue;
 
$coltheme_rsCatalogue = "1";
IF (isset($_GET['rubriqueID'])) {
  $coltheme_rsCatalogue = $_GET['rubriqueID'];
}
$colsurface_rsCatalogue = "1";
IF (isset($_GET['VARsurface'])) {
  $colsurface_rsCatalogue = $_GET['VARsurface'];
}
$colnombre_rsCatalogue = "1";
IF (isset($_GET['piecesID'])) {
  $colnombre_rsCatalogue = $_GET['piecesID'];
}
$colbien_rsCatalogue = "1";
IF (isset($_GET['transactionID'])) {
  $colbien_rsCatalogue = $_GET['transactionID'];
}
mysql_select_db($database_ConnexionBoutiquedream, $ConnexionBoutiquedream);
$query_rsCatalogue = sprintf("SELECT a.rubriqueID , a.transactionID, a.piecesID, a.Surface, a.Reference,  a.Libelle FROM appartements a WHERE a.rubriqueID =%s AND a.transactionID=%s AND a.piecesID=%s UNION ALL  SELECT m.rubriqueID , m.transactionID, m.piecesID, m.Reference, m.Libelle FROM maisons m WHERE m.rubriqueID =%s AND m.transactionID=%s AND m.piecesID=%s , GetSQLValueString($coltheme_rsCatalogue, "int"),GetSQLValueString($colbien_rsCatalogue, "int"),GetSQLValueString($colnombre_rsCatalogue, "int"),GetSQLValueString($coltheme_rsCatalogue, "int"),GetSQLValueString($colbien_rsCatalogue, "int"),GetSQLValueString($colnombre_rsCatalogue, "int"));
$query_limit_rsCatalogue = sprintf("%s LIMIT %d, %d", $query_rsCatalogue, $startRow_rsCatalogue, $maxRows_rsCatalogue);
$rsCatalogue = mysql_query($query_limit_rsCatalogue, $ConnexionBoutiquedream) or die(mysql_error());
$row_rsCatalogue = mysql_fetch_assoc($rsCatalogue);
 
if (isset($_GET['totalRows_rsCatalogue'])) {
  $totalRows_rsCatalogue = $_GET['totalRows_rsCatalogue'];
} else {
  $all_rsCatalogue = mysql_query($query_rsCatalogue);
  $totalRows_rsCatalogue = mysql_num_rows($all_rsCatalogue);
}
$totalPages_rsCatalogue = ceil($totalRows_rsCatalogue/$maxRows_rsCatalogue)-1;
 
mysql_select_db($database_ConnexionBoutiquedream, $ConnexionBoutiquedream);
$query_rsbien = "SELECT * FROM transactions ORDER BY bien ASC";
$rsbien = mysql_query($query_rsbien, $ConnexionBoutiquedream) or die(mysql_error());
$row_rsbien = mysql_fetch_assoc($rsbien);
$totalRows_rsbien = mysql_num_rows($rsbien);
 
mysql_select_db($database_ConnexionBoutiquedream, $ConnexionBoutiquedream);
$query_rsnombre = "SELECT * FROM pieces ORDER BY nombre ASC";
$rsnombre = mysql_query($query_rsnombre, $ConnexionBoutiquedream) or die(mysql_error());
$row_rsnombre = mysql_fetch_assoc($rsnombre);
$totalRows_rsnombre = mysql_num_rows($rsnombre);
?>
 
<!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" />
</head>
 
<body>
<
<div class="content1">
      <table width="100%" border="0">
        <?php do { ?>
          <tr>
            <td><?php echo $row_rsCatalogue['Reference']; ?></td>
            <td><?php echo $row_rsCatalogue['Libelle']; ?></td>
          </tr>
          <?php } while ($row_rsCatalogue = mysql_fetch_assoc($rsCatalogue)); ?>
      </table>
         </div>
 
<div class="sidebar2">
  	    <form name="form1" method="get" action="">
    <table width="100%" border="0" class="table5" >
  <tr>
    <td colspan="2" style="color:#FFF"><label>
                    <input <?php IF (!(strcmp($_GET['transactionID'],"1"))) {echo "checked=\"checked\"";} ?> <?php IF (!(strcmp($_GET['transactionID'],1))) {echo "checked=\"checked\"";} ?> type="radio" name="transactionID" value="1" id="transaction_0" />
              Acheter</label></td>
    <td colspan="2" style="color:#FFF"><label>
                    <input <?php IF (!(strcmp($_GET['transactionID'],"2"))) {echo "checked=\"checked\"";} ?> type="radio" name="transactionID" value="2" id="transactionID_1" />
              Louer</label></td>
  </tr>
  <tr>
    <td colspan="4" style="color:#FFF"><span style="color:#e6e8e9; font-size:12px; font-weight:bold" >TYPE(S) DE BIENS</span></td>
    </tr>
  <tr>
    <td colspan="2" style="color:#FFF"><label>
                    <input <?php IF (!(strcmp($_GET['rubriqueID'],1))) {echo "checked=\"checked\"";} ?> type="checkbox" name="rubriqueID" value="1" id="rubriqueID_0" />
              Appartement</label></td>
    <td colspan="2" style="color:#FFF"><label>
                    <input  type="checkbox" name="rubriqueID" value="2" id="rubriqueID_1" />
              Maison</label></td>
    </tr>
<tr>
    <td style="color:#FFF"><label>
                    <input <?php IF (!(strcmp($_GET['piecesID'],1))) {echo "checked=\"checked\"";} ?> type="checkbox" name="piecesID" value="1" id="piecesID_0" checked="checked"/>
            T1</label></td>
    <td style="color:#FFF"><label>
                    <input type="checkbox" name="piecesID" value="2" id="piecesID_1" />
                    T2</label></td>
    <td style="color:#FFF"><label>
                <input  name="piecesID" type="checkbox" id="piecesID_2" value="3"/>
            T3</label></td>
    <td style="color:#FFF"><label>
                <input  name="piecesID" type="checkbox" id="piecesID_3" value="4"/>
            T4</label></td>
  </tr>
  <tr>
    <td style="color:#FFF"><label>
                <input  name="piecesID" type="checkbox" id="piecesID_4" value="5"/>
            T5+</label></td>
    <td>&nbsp;</td>
    <td colspan="2">&nbsp;</td>
  </tr>
<tr>
    <td colspan="4" align="center"><input type="submit" name="button" id="button" value="Rechercher" /></td>
  </tr>
    </table>
    </form>
</div>
</body>
</html>
<?php
mysql_free_result($rsTheme);
 
mysql_free_result($rsCatalogue);
 
mysql_free_result($rsbien);
 
mysql_free_result($rsnombre);
 
?>
Merci pour ton aide Tatayo.
bili31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2012, 14h34   #8
Membre actif
 
Inscription : janvier 2012
Messages : 117
Détails du profil
Informations forums :
Inscription : janvier 2012
Messages : 117
Points : 173
Points : 173
Ligne 72, tu n'as pas un problème de guillemets?

Code :
1
2
3
4
5
6
$query_rsCatalogue = sprintf("SELECT a.rubriqueID , a.transactionID, a.piecesID, a.Surface, a.Reference,  a.Libelle FROM appartements a WHERE a.rubriqueID =%s AND a.transactionID=%s AND a.piecesID=%s UNION ALL  SELECT m.rubriqueID , m.transactionID, m.piecesID, m.Reference, m.Libelle FROM maisons m WHERE m.rubriqueID =%s AND m.transactionID=%s AND m.piecesID=%s , GetSQLValueString($coltheme_rsCatalogue, int"),
GetSQLValueString($colbien_rsCatalogue,"int"),
GetSQLValueString($colnombre_rsCatalogue,"int"),
GetSQLValueString($coltheme_rsCatalogue,"int"),
GetSQLValueString($colbien_rsCatalogue,int"),
GetSQLValueString($colnombre_rsCatalogue, "int"));
que je remplacerais par :
Code :
1
2
3
4
5
6
$query_rsCatalogue = sprintf("SELECT a.rubriqueID , a.transactionID, a.piecesID, a.Surface, a.Reference,  a.Libelle FROM appartements a WHERE a.rubriqueID =%s AND a.transactionID=%s AND a.piecesID=%s UNION ALL  SELECT m.rubriqueID , m.transactionID, m.piecesID, m.Reference, m.Libelle FROM maisons m WHERE m.rubriqueID =%s AND m.transactionID=%s AND m.piecesID=%s ", GetSQLValueString($coltheme_rsCatalogue, int"),
GetSQLValueString($colbien_rsCatalogue,"int"),
GetSQLValueString($colnombre_rsCatalogue,"int"),
GetSQLValueString($coltheme_rsCatalogue,"int"),
GetSQLValueString($colbien_rsCatalogue,int"),
GetSQLValueString($colnombre_rsCatalogue, "int"));
KookieMonster est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2012, 19h45   #9
Invité de passage
 
Inscription : novembre 2008
Messages : 24
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 24
Points : 0
Points : 0
Bien vue KookieMonster, effectivement il manque les guillemets,
Seulement cela ne me resoud pas le problème d'afficher les appartements et les maisons sur la même page si les deux cases sont cochées, pareil si on coche les T1 et T2 en même temps.
bili31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2012, 09h19   #10
Membre actif
 
Inscription : janvier 2012
Messages : 117
Détails du profil
Informations forums :
Inscription : janvier 2012
Messages : 117
Points : 173
Points : 173
@Waldar: merci pour les balises code, je m'en servirais à l'avenir.
@bili31: désolé, je n'arrive pas à voir ce qui ne va pas dans la requête réalisant l'union des apparts et maisons (sous réserve que les types sont identiques pour les différentes colonnes...).

Code :
1
2
3
4
5
6
7
8
9
SELECT a.rubriqueID , a.transactionID, a.piecesID, a.Surface, a.Reference,  a.Libelle 
FROM appartements a 
WHERE a.rubriqueID =%s AND a.transactionID=%s AND a.piecesID=%s 
 
UNION ALL  
 
SELECT m.rubriqueID , m.transactionID, m.piecesID, m.Reference, m.Libelle
FROM maisons m 
WHERE m.rubriqueID =%s AND m.transactionID=%s AND m.piecesID=%s
Quels sont les problèmes / messages d'erreurs que tu rencontres?
KookieMonster est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2012, 09h21   #11
Membre actif
 
Inscription : janvier 2012
Messages : 117
Détails du profil
Informations forums :
Inscription : janvier 2012
Messages : 117
Points : 173
Points : 173
je me réponds tout seul, prouvant ainsi l'utilité de #code !
Code :
1
2
3
4
5
6
7
8
9
10
SELECT a.rubriqueID , a.transactionID, a.piecesID, a.Surface, a.Reference,  a.Libelle 
FROM appartements a 
WHERE a.rubriqueID =%s AND a.transactionID=%s AND a.piecesID=%s 
 
UNION ALL  
 
SELECT m.rubriqueID , m.transactionID, m.piecesID, m.Surface, m.Reference, m.Libelle
FROM maisons m 
WHERE m.rubriqueID =%s AND m.transactionID=%s AND m.piecesID=%s
KookieMonster est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2012, 23h30   #12
Invité de passage
 
Inscription : novembre 2008
Messages : 24
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 24
Points : 0
Points : 0
Merci beaucoup!
bili31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h07.


 
 
 
 
Partenaires

Hébergement Web