[MySql] Exists in Where-Klause - komplexe Abfrage

Subwoover

Erfahrenes Mitglied
Heyho - ich nochmal :)

Ich habe da zu einem anderen Projekt auch noch eine kleine Problematik. Ich selektiere (nach Absenden eines Suche-Forms) anhand gesetzter Form-Felder, Datensätze aus der Datenbank.

Ich habe hier eine Relation zwischen Der Tabelle "Anzeige" und "Ausstattung" welche als Tabelle "rel_ausstattung" vorhanden ist.

Ich habe folgende Herangehensweise mit PHP entwickelt:
PHP:
					$get_ausstattung = mysql_query("SELECT * FROM $this->aus_tb");
					while ($show = mysql_fetch_object($get_ausstattung))
					{
						$key_var = "aus_".$show->id;
						if (!empty($_POST[$key_var]))
						{
							$query .= " exists (SELECT id FROM $this->aus_rel_tb WHERE ausstattung = '$show->id' AND anzeige = a.id)";
						}

Davor finden sich die anderen Formfelder als normale WHERE ... AND... Bedingungen.
das "a.id" ist aus das Feld "id", ein Integer aus der Tabelle Anzeige.

Ich möchte hier jedoch die Checkboxes aus der Search-Form abfragen (Schleife) und dann sehen ob eine Relation zu dem Tupel existiert. Also im selben Statement a.id (Anzeige-Primary-Key) in der Relation zur aktuellen Schleifen-Index "$show->id" suchen.

Mit Exist seh ich eben ob dieses existiert.
Ich erhalte jedoch eine Fehlermeldung:
Code:
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 'exists (SELECT id FROM ea_rel_ausstattung WHERE ausstattung = '1' AND anzeige = ' at line 1

Nun, ist das überhaupt möglich, so wie ichs probiere? Oder gibts da eine Substitution dafür? Bitte um Hilfe :)
 
Hallo,

mal zusammengefasst: die Tabellen „Anzeige“ und „Ausstattung“ stehen in einer n:m-Relation, die über die Tabelle „rel_ausstattung“ abgebildet wird. Du suchst nun alle Elemente aus „Anzeige“, die zu jedem Element einer bestimmten Teilmenge von „Ausstattung“ in Relation stehen. Hab ich das soweit richtig aufgefasst?

Grüße,
Matthias
 
Ich suche eine Teilmenge von Ausstattung die (durch die Schleife) zum aktuellen Tupel (einer Menge von Anzeige) über die Relation abgebildet ist.
Es stellt sich die Frage, ob das nun auch so realisiert werden kann (siehe Mysql-Error + mein Statement).
 
PHP:
$query = "SELECT a.id AS aid,a.datum,a.preview,a.name,a.marke,a.user,a.bj,a.km,a.tueren,a.farbe,a.ps,a.kw,a.standort_city,a.standort_land,a.vb,a.preview_ext,m.name AS marken_name FROM ".$this->anzeigen_tb." AS a LEFT JOIN ".$this->user_tb." AS u ON a.user = u.id LEFT JOIN ".$this->marken_tb." AS m ON a.marke = m.id WHERE a.id != '0'";

					if (!empty($_POST['name']))
						$query .= " AND a.name LIKE '%$_POST[name]%'";
					if (!empty($_POST['marke']))
						$query .= " AND a.marke = '$_POST[marke]'";
					if (!empty($_POST['kat']))
						$query .= " AND a.kat = '$_POST[kat]'";
					if (!empty($_POST['karosserie']))
						$query .= " AND a.karosserie = '$_POST[karosserie]'";
					if (!empty($_POST['farbe']))
						$query .= " AND a.farbe LIKE '%$_POST[farbe]%'";
					if (!empty($_POST['lack']))
						$query .= " AND a.lack LIKE '$_POST[lack]'";
					if (!empty($_POST['bj']))
						$query .= " AND a.bj LIKE '$_POST[bj]'";
					if (!empty($_POST['km']))
						$query .= " AND a.km <= '$_POST[km]'";
					if (!empty($_POST['tueren']))
						$query .= " AND a.tueren >= '$_POST[tueren]'";
					if (!empty($_POST['sitze']))
						$query .= " AND a.sitze >= '$_POST[sitze]'";
					if (!empty($_POST['kraftstoff']))
						$query .= " AND a.kraftstoff LIKE '$_POST[kraftstoff]'";
					if (!empty($_POST['antrieb']))
						$query .= " AND a.antrieb LIKE '$_POST[antrieb]'";
					if (!empty($_POST['automatik']))
						$query .= " AND a.automatik = '1'";
					if (!empty($_POST['ps']))
						$query .= " AND a.ps >= '$_POST[ps]'";
					if (!empty($_POST['kw']))
						$query .= " AND a.kw >= '$_POST[kw]'";

					$get_ausstattung = mysql_query("SELECT * FROM $this->aus_tb");
					while ($show = mysql_fetch_object($get_ausstattung))
					{
						$key_var = "aus_".$show->id;
						if (!empty($_POST[$key_var]))
						{
							$query .= " exists (SELECT id FROM $this->aus_rel_tb WHERE ausstattung = '$show->id' AND anzeige = )";
						}
					}



					if ($_POST['search_list'] == "used") {
						$query .= " AND a.used = '1'";
					} elseif ($_POST['search_list'] == "new") {
						$query .= " AND a.used = '0'";
					}

					$query .= " ORDER BY";

					if (!empty($_POST['sort'])) {
						$query .= " $_POST[sort] $_POST[sort_dir]";
					} else {
						$query .= " a.name ASC";
					}
					//$query .= " GROUB BY a.id";

					$do_query = mysql_query($query); echo mysql_error();
					$number = mysql_num_rows($do_query);
					$seiten = floor($number/$this->perpage);
					$start = $page * $this->perpage;
					$ende = $start + $this->perpage;
					$result = mysql_query($query." LIMIT $start,$this->perpage");
 
Hallo!

Ich habe nur den Hergang des SQL-Statements gepostet. Anhand dieser paar Zeilen sieht man leicht wie das Statement gebildet wird. Wichtig ist jedoch der Teil mit dem Exist ;)
 
Hallo,

na wenn du das sagst… ich hab jedenfalls keine Lust, mich erst durch PHP-Code zu wühlen und mir daraus von Hand etwas zusammenzubauen, was du auch mit einem einfachen echo ausgeben könntest. Aber vielleicht findet sich ja jemand anderes, der sich die Arbeit macht.

Grüße,
Matthias
 
Ich habe auch wenig Lust PHP Code zu lesen (besonders da ich PHP nicht so sehr gut kann), mir fällt aber nur so direkt auf dass vor dem EXISTS ein AND fehlt, kann das sein?

In der while-Schleife sollte vor jedes EXISTS noch ein AND.
 
Zurück