komplizierte Abfrage

alexfrenzel92

SQL-Guru
Beiträge
122
Guten Abend,

Mir fällt kein besserer Titel ein, der mein Aliegen besser nennt.

Aus einer Tabelle ist eine Spalte mit Zahlen bunt durchgemischt von 1-36.

Mit
$id = strip_tags($_GET[id]) + 0;
und
'SELECT * FROM `TABLE 4` WHERE `COL 1` = '.$id;
kann ich die Zahl aus jener Spalte ermitteln, die der Zeile steht, die in der Adresszeile beschrieben ist.

Eine weitere Tabelle (mit 36 Zeilen und einer Spalte) stehen 36 unterschiedliche Werte bzw. kurze Namen.

In einer weiteren Abfrage will ich nun den Namen ermitteln, der in der Zeile steht, dessen Zahl in der Adresszeile steht, doch ich komme nicht darauf, wie die Abfrage lauten muss.

Wenn jemand mitkommt, wäre ich froh, wenn mir jemand helfen kann.

Vielen Dank und Grüße
Alex
 
Werbung:
Guten Abend,

Mir fällt kein besserer Titel ein, der mein Aliegen besser nennt.

Aus einer Tabelle ist eine Spalte mit Zahlen bunt durchgemischt von 1-36.

Mit
$id = strip_tags($_GET[id]) + 0;
und
'SELECT * FROM `TABLE 4` WHERE `COL 1` = '.$id;
kann ich die Zahl aus jener Spalte ermitteln, die der Zeile steht, die in der Adresszeile beschrieben ist.

Eine weitere Tabelle (mit 36 Zeilen und einer Spalte) stehen 36 unterschiedliche Werte bzw. kurze Namen.

In einer weiteren Abfrage will ich nun den Namen ermitteln, der in der Zeile steht, dessen Zahl in der Adresszeile steht, doch ich komme nicht darauf, wie die Abfrage lauten muss.

Wenn jemand mitkommt, wäre ich froh, wenn mir jemand helfen kann.

Vielen Dank und Grüße
Alex


Du suchst einen JOIN. (sofern ich Dich richtig geparst habe).

Also, Du hast:

Code:
test=*# create table namen (id int primary key, name text);
CREATE TABLE
test=*# insert into namen values (1,'name1');
INSERT 0 1
test=*# insert into namen values (2,'name2');
INSERT 0 1
test=*# insert into namen values (3,'name3');
INSERT 0 1
test=*# create table bla(name int references namen);
CREATE TABLE
test=*# insert into bla values (1);
INSERT 0 1
test=*# insert into bla values (2);
INSERT 0 1
test=*# insert into bla values (3);
INSERT 0 1
test=*# insert into bla values (2);
INSERT 0 1
test=*# insert into bla values (1);
INSERT 0 1
test=*# select * from namen ;
 id | name
----+-------
  1 | name1
  2 | name2
  3 | name3
(3 rows)

test=*# select * from bla ;
 name
------
  1
  2
  3
  2
  1
(5 rows)
[code]

Du willst nun in bla hinter jeder Nummer den Namen ans der Tabelle namen haben:

[code]
test=*# select bla.name, namen.name from bla left join namen on bla.name=namen.id;
 name | name
------+-------
  1 | name1
  2 | name2
  3 | name3
  2 | name2
  1 | name1
(5 rows)

So, nun lern Grundlagen! Das ist massig dokumentiert. Suche nach join.
 
Also ich nähere mich der Lösung für dieses Anliegen langsam.

Als Fehlermeldung kommt nun leider:
Warning: mysql_fetch_row() expects parameter 1 to be resource, boolean given in ......

Die Abfrage lautet:
Code:
'SELECT * FROM `TABLE 4` LEFT OUTER JOIN `Table 1` ON `Table 1.COL 1` = `TABLE 4.COL 10` WHERE `TABLE 4.COL 1` = '.$id;

Ist das jetzt php oder immernoch sql - und, wenn sql wo könnte der Fehler liegen?
Danke für eure Hilfe und guten Abend!
 
oder auch doch nicht :)

Bei folgender Abfrage

'SELECT * FROM `TABLE 4` LEFT OUTER JOIN `TABLE 1` ON `TABLE 4`.`COL 10` = `TABLE 1`.`COL 1` WHERE `TABLE 4`.`COL 1` = '.$id;

...kommt immernoch die Spalte 1 (der TABLE 1) eins im Ergebnis.
Ich will jedoch Spalte 2 (der TABLE 1) im Ergebnis.

Wo muss ich `TABLE 1`.`COL 2` unterbringen, damit sie anstelle von `TABLE 1`.`COL 1` angezeigt wird?
 
oder auch doch nicht :)

Bei folgender Abfrage

'SELECT * FROM `TABLE 4` LEFT OUTER JOIN `TABLE 1` ON `TABLE 4`.`COL 10` = `TABLE 1`.`COL 1` WHERE `TABLE 4`.`COL 1` = '.$id;

...kommt immernoch die Spalte 1 (der TABLE 1) eins im Ergebnis.
Ich will jedoch Spalte 2 (der TABLE 1) im Ergebnis.

Wo muss ich `TABLE 1`.`COL 2` unterbringen, damit sie anstelle von `TABLE 1`.`COL 1` angezeigt wird?

Angezeigt wird das, was nach select und vor JOIN bzw. FROM kommt. Das * sollte man (ver)meiden und dafür richtig aufzählen, was man sehen will.

Nummer in Spalten- und Tabellennamen sind oft dezente Hinweise auf ein kapottes Design, Leerzeichen in Table- und/oder Spaltennamen sind ganz übel.
 
Das * sollte man (ver)meiden und dafür richtig aufzählen, was man sehen will.

Die SQL-Spezifikation sieht keine verbindlichen Regeln für die Reihenfolge der Spalten vor. Theoretisch könnten die Spalten also bei jeder Abfrage an einer anderen Stelle stehen. Zusätzlich kommt abhängig vom Datenbankdesign dazu, dass ggf. auch große BLOBs ausgeliefert werden die nicht benötigt werden.
 
hm okay, ich selbst komme nicht auf die Lösung, es kommen immer wieder Fehlermeldungen.
Ich schreibe deswegen jetzt eine genaue Beschreibung der Datenbanken/php-Codes und würde mich freuen, wenn mir jemand die Lösung erarbeiten könnte.

Es ist jetzt sozusagen gemischt php und sql also hoffe ich, dass es okay ist, wenn ich das Anliegen in das Datenbank-forum und nicht in ein php-forum schreibe.

Ich habe zwei Tabellen (TABLE 4 und TABLE 1)
In TABLE 4 (COL 10) stehen bunt durchgemischt Zahlen von 1-30, wobei auch jede Zahl öfter vorkommen kann.
In TABLE 4 (COL 1) stehen sortiert mehr als 100 Zahlen, wobei jede nur einmal vorkommt (=100+ Zahlen)
In TABLE 1 (COL 1) stehen die Zahlen 1-30 in COL 2 steht dabei ein individueller Name, wobei jede Zahl und jeder Name jeweils nur einmal vorkommt (= 30 Einträge)

In der Adresszeile steht am Ende &id=? wobei eine Zahl von 1 bis etwas mehr als 100 eingetragen wird

Die erste Abfrage lautet:
Code:
$id = strip_tags($_GET[id]) + 0;
$abfrage = 'SELECT * FROM `TABLE 4` WHERE `COL 1` = '.$id;
$ergebnis = mysql_query($abfrage);
while($row = mysql_fetch_row($ergebnis)

Mit <?php echo $row[...]; ?> kann ich die Einträge der Zeile abrufen, deren "COL 1" der eingetragenen Zahl in der Adresszeile entspricht.
Das funktioniert soweit.

Die zweite Abfrage lautet in etwa (wobei der Code fehlerhaft sein dürfte - ich schreibe ihn nur, damit man sich an ihm oriertieren kann, was ich wirklich vorhabe):
Code:
$id = strip_tags($_GET[id]) + 0;
$abfrage1 = 'SELECT * FROM `TABLE 4` LEFT OUTER JOIN `Vereine` ON `TABLE 4`.`COL 10` = `Vereine`.`COL 1` WHERE `TABLE 4`.`COL 1` = '.$id;
$ergebnis1 = mysql_query($abfrage1);
while($row = mysql_fetch_row($ergebnis1)

Mit
Code:
<b><a href="index.php?var=Verein&id=<?php echo $row[x1]; ?>" style="color:black"><?php echo $row[x2]; ?></a></b>
...will ich nun bei x1 die Zahl aufrufen, die in COL 10 der TABLE 4 der Zeile abrufen, die in der Adresszeile steht
...bei echo $row[x2] soll nun der Name aus TABLE1.COL2 stehen, der in der Zeile steht, die bei der gerade ermittelten Zahl (aus TABLE 4.COL10) steht.

Die erste Abfrage, wie gesagt, funktioniert problemlos - die zweite Abfrage auch, nur, dass bei x2 nicht der Name (aus TABLE1.COL2) steht, sondern auch die Zahl, die ich gerade aus (aus TABLE 4.COL10) ermittelt habe.

Ich will aber den Namen (der in der TABLE1.COL2 steht) ermittelt bekommen, der in der Zeile steht, die mein Browser anzeigt (anstatt des Namen in der Spalte daneben), wie erwünscht...

Ich habe es, wie gesagt nicht hingekriegt, vielleicht bekommt es von euch einer hin...
Danke im vorraus
 
Werbung:
Code:
`TABLE 4`.`COL 10` = `Vereine`.`COL 1`
Wo kommt jetzt Vereine her? Vorher hast du von Table1 geschrieben.

Sind x1 und x2 Konstanten? Und welchen Wert haben sie? Wenn es keine Konstanten sind machst du was falsch.

Versuch doch mal:
Code:
SELECT `TABLE4`.`Col1`, `TABLE1`.`Col2` FROM …

Code:
$id = strip_tags($_GET[id]) + 0;
In diesem Fall dürfte intval() sinnvoller sein.
 
Zurück
Oben