MYSQL Abfragen verknüpfen

Bilzebub

Mitglied
hi,
ich möchte 2 Abfragen miteinander verknüpfen. Bei den Abfragen handelt es sich jeweils um ein und dieselbe Tabelle. (geodb_textdata) kennen denke ich einige von euch.

Aktuell habe ich 2 abfragen:
PHP:
$anfrage1=mysql_query("SELECT * FROM `$_db_geodb_textdata` WHERE text_type = '400100000' && text_val = '".$_POST['loc_id']."'");

$anfrage1a=mysql_query("SELECT * FROM `$_db_geodb_textdata` WHERE loc_id='".$row1['loc_id1']."' && text_type='500100000'");

Diese möchte ich so verbinden dass ich in der Abfrage nach text_val (der $anfrage1a) sortieren kann. Jedoch hänge ich mich da auf. Abfragen von 2 verschiedenen Tabellen mit INNER JOIN usw. habe ich mir bereits angesehen aber das bringt mich leider nicht weiter...

vielleicht habt ihr ja einen heißen tip ;)

Vielen Dank
 
Ich versteh nicht wie die Verknüpfung sein soll.
Ist das 2te SQL in der Schleife der Auswertung des ersten SQL?
Was ist text_val?
Was willst du am Ende eigentlich haben?


Nachtrag:
So auf die schnelle denke ich, dass du sowas willst
SQL:
SELECT
	a.*,
	b.*
FROM
	`{$_db_geodb_textdata}` AS a,
	`{$_db_geodb_textdata}` AS b
WHERE
	b.loc_id=a.loc_id1 
	AND a.text_type = '400100000' 
	AND a.text_val = '{$_POST['loc_id']}'	
	AND b.text_type='500100000'
ORDER BY 
	a.text_val
 
Zuletzt bearbeitet von einem Moderator:
hi,
erstmal vielen Dank. Genau das habe ich gesucht.
Ich wusste nur nicht wie ich die Abfrage auf die gleiche Tabelle mache... wie schon gesagt LEFT JOIN, INNER JOIN usw. habe ich gefunden aber das brachte mich so nicht weiter.

Aber um deine Frage zu beantworten.
$Anfrage1a befand sich in der Schleife. Ich dachte es wäre logisch und nicht erwähnenswert aber du hast recht, wer das Script und die Gedanken dahinter nicht vor Augen hat versteht das nicht als logisch.

Jedoch fand ich die art der Abfrage wie ich sie da hatte etwas "nüchtern" und ich hatte nun auch das Problem das sich so nicht mehr nach dem Namen sortieren kann da mir $anfrage1 nur zahlenwerte zurückliefert. Also wollte ich das irgendwie "verknüpfen" evtl. schlecht gewählt der Ausdruck... nur wie soll ich es sonst nennen?
Bei der Datenbank handelt es sich um eine art PLZ-referenz.
loc_id ist die ID jedoch nicht spezifisch für einen Datensatz sondern für einen Ort. Somit kann sich die loc_id mehrmals als Datensatz in der Tabelle befinden jedoch mit verschiedenen Informationen.
text_type legt fest welche Informationen sich in dem Datensatz unter text_val befinden.

Also suche ich mir z.B. text_type=500300000 raus erhalte ich lauter postleitzahlen. Ich hoffe ich konnte das halbwegs verständlich erklären. Im Anhang habe ich dir mal einen auszug hinterlegt wo ich nach einer loc_id gesucht habe.

Ich bedanke mich ncohmal herzlich für deine Hilfe.
meine Abfrage sieht nun so aus:
PHP:
$anfrage1=mysql_query("
                            SELECT
                                a.loc_id AS loc_id,
                                a.text_val AS text_val
                            FROM
                                `$_db_geodb_textdata` AS a,
                                `$_db_geodb_textdata` AS b
                            WHERE
                                b.loc_id=a.loc_id
                                AND a.text_type = '400100000' 
                                AND a.text_val = '".$_POST['loc_id']."'   
                                AND b.text_type='500100000'
                            ORDER BY 
                                b.text_val
                         ") or die(mysql_error());
deine {} um meine Variabeln habe ich nicht verstanden daher habe die nicht genutzt. Evtl. magst du mir den Zweck ja noch erklären ;)
Funktioniert prima so wie nun ist.
Ich habe mir überlegt noch eine dritte Abfrage mit einzusetzen jedoch bin ich mit dem gedanken noch nicht fertig.
In der Tabelle geodb_coordinates befinden sich die geologischen Koordinaten der Orte.
Jedoch ist nicht immer zwingend ein Satz Koordinaten vorhanden (z.b. wenn es sich um einen Landkreis handelt).
Meine Abfrage würde dann ja so aussehen:?
PHP:
    $anfrage1=mysql_query("
                            SELECT
                                a.loc_id AS loc_id,
                                b.text_val AS text_val,
                                c.lat as lat,
                                c.lon as lon
                            FROM
                                `$_db_geodb_textdata` AS a,
                                `$_db_geodb_textdata` AS b,
                                `$_db_geodb_coordinates` AS c
                            WHERE
                                b.loc_id=a.loc_id
                                AND b.loc_id=c.loc_id
                                AND a.text_type = '400100000' 
                                AND a.text_val = '".$_POST['loc_id']."'   
                                AND b.text_type='500100000'
                            ORDER BY 
                                b.text_val
                         ") or die(mysql_error());
Jedoch wenn nun keine Koordinaten vorhanden sind gibt er mir nichts zurück da b.loc_id!=c.loc_id ist... wie kann ich nun feststellen ob überhaubt datensätze mit der loc_id unter c vorhanden sind? mit Count habe ich es schon versucht aber da habe ich eine fehlermeldung bekommen: "Falsche Verwendung einer Gruppierungsfunktion"

Evtl. kannst du mir da noch weiterhelfen. Ist aber nicht ganz so schlimm... aber dann spare ich mir eine weitere Abfrage ^^
 

Anhänge

  • Unbenannt.PNG
    Unbenannt.PNG
    4,2 KB · Aufrufe: 7
Zm Thema {}
Probiere mal den folgenden Code und du wirst verstehen
PHP:
$foo = 'foo';
echo "Hallo $foobar<br />";
echo "Hallo {$foo}bar<br />";
Zudem kann innerhalb von {} direkt auf Array-Elemente oder Objekt-Properties zugegriffen werden
PHP:
$array = array('id_0'=>'foo', 'id_1'=>'bar');
$object = (object) $array;
echo "Hallo {$array['id_0']}{$object->id_1}<br />";
//geht sogar mit " anstelle von ' für den Indexname
echo "Hallo {$array["id_0"]}{$object->id_1}<br />";
//und somit kann der Index des Arrays wieder aus einem zusammengesetzten String bestehen
$id = 0;
echo "Hallo {$array["id_{$id}"]}{$object->id_1}<br />";
Und wenn man sich die {} einfach angewöhnt (den falsch sind sie nie), muss man sich keine Gedanken mehr machen, damit solche Fehler wie im ersten Beispiel passieren.
Zudem ists mMn besser lesbar, aber das ist Geschmacksachse

Nun zum Problem
Du brauchst LEFT JOINS. So wie es jetzt stehts sind es alles INNER JOINS.
Die 2 Tabellen kannst du weiterhin mit einem INNER JOIN verknüpfen. Die Koordinaten kannst du dann mit einem LEFT JOIN anhängen. Das heisst, nimm alles von a+b und wenn was da ist noch c
SQL:
SELECT
    a.loc_id AS loc_id,
    b.text_val AS text_val,
    c.lat as lat,
    c.lon as lon
FROM
    `{$_db_geodb_textdata}` AS a
    INNER JOIN `{$_db_geodb_textdata}` AS b
        ON b.loc_id=a.loc_id
    LEFT JOIN `{$_db_geodb_coordinates}` AS c
        ON b.loc_id=c.loc_id
WHERE   
    a.text_type = '400100000' 
    AND a.text_val = '{$_POST['loc_id']}'   
    AND b.text_type='500100000'
ORDER BY 
    b.text_val
 
Zuletzt bearbeitet von einem Moderator:
hi, sorry dass ich mich erst so spät melde... Wetter war so gut musste erst mal was draußen machen ;)
Hat super geklappt! Danke dir.
Das mit den {} ... ja doof jetzt wo du das beispiel gezeigt hast ... ich erinnere mich waage an mein erstes Tutorial da stand das gleich... wenn nicht sogar das selbe ^^
aber ich denke...
PHP:
$foo = 'foo';
echo "Hallo $foobar<br />";
echo "Hallo ".$foo."bar<br />";
...damit liege ich auch auf der sicheren Seite... habe es mir angewöhnt das bei fast jeder Variable zu machen... finde das auch lesbar.
Nun gut. Nochmal vielen Dank.
Erledigt! ;)
 
Zurück