"We are back" « oc.at

Mysql Query Problem

Maehmann 21.09.2003 - 18:40 1086 15
Posts

Maehmann

OC Addicted
Avatar
Registered: Aug 2002
Location: Vienna
Posts: 1110
Hey

Ich hab folgende zwei Tabellen:
1: id, name, dateiname
2: id, name_id, lang_id, titel, text

Jetzt wählt der Benutzer eine Sprache aus, welche in eine Session geschrieben wird($lang_id)

Jetzt möchte ich aus der Tabelle 1 alle namen auslesen für die in der Tabelle 2 noch kein Titel/Text eingefügt wurde (heißt, dass kein entsprechender Datensatz existiert).

Kleines Beispiel sollte nicht ganz klar sein was ich brauche:

Tabelle 1:
1, hansi, hansi.jpg
2, peppi, peppibild.jpg
3, franz, bild.jpg

Tabelle 2:
1, 1, de, Doktor, blabalabala
2, 2, en, Doctor, englischer blabla

Ich möchte jetzt haben, dass ich die Sprache "Deutsch" auswähle und als Ergebnis des Querys soll rauskommen:

2, peppi
3, franz

Oder ich suchen nach "Englisch", dann sollt das Ergebnis so aussehen:

1, hansi
3, franz

Geht das überhaupt?
Wenn ja, wie?

*tia*

Christoph

atrox

in fairy dust... I trust!
Avatar
Registered: Sep 2002
Location: HTTP/1.1 404
Posts: 2782
das geht entweder mit einem subselect (arg.. mysql!) oder mit einem outer join:

zb so:
SELECT tabelle1.id,tabelle1.name FROM tabelle1
LEFT OUTER JOIN tabelle2 ON tabelle1.id=tabelle2.id
WHERE tabelle2.id IS NULL;

ich hoffe natürlich, du benennst die tabellen nach den entitäten

Maehmann

OC Addicted
Avatar
Registered: Aug 2002
Location: Vienna
Posts: 1110
hmmm ... ganz versteh ichs nicht ... die eine tabelle heißt
"namen" und die zweite heißt "texte"

warum sollt ich die beiden tabellen über die ids verknüpfen? Die haben ja miteinander nichts zu tun ...
Wenn dann müsst ich sie doch per namen.id = texte.name_id verknüpfen, oder?
Das funkt aber auch nicht :(

Und irgendwie muss noch die lang_id irgendwie in den Query rein ...

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
Code: PHP
$querystring = "SELECT namen.id, namen.name 
FROM namen,texte
WHERE namen.id=texte.namensid
   AND texte.titel IS NULL
   AND texte.text IS NULL
   AND texte.lang={$_SESSION[lang_id]}"

funkt, vorrausgesetzt die felder die NULL sein müssen _können_ NULL sein und haben keinen default-wert, sonst muss der defaultwert damit ersetzt werden
ob der select das schnellste mögliche is weiss ich nicht, aber funken sollts...

Edit: Aja, und du hättest ruhig dazuschreiben können dass es um mysql in php geht...
Bearbeitet von watchout am 21.09.2003, 21:48 (code - plop, die lang vergessen... und nomal...)

Maehmann

OC Addicted
Avatar
Registered: Aug 2002
Location: Vienna
Posts: 1110
Hey.

Thx erstmal ...

das funktioniert allerdings nur, wenn ich schon in der Tabelle "texte" einen Datensatz hab mit ausgefüllten id, namen_id, und lang_id Feldern...
das Problem ist, dass es diesen Datensatz ja noch garnicht gibt.

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
Zitat von Maehmann
Hey.

Thx erstmal ...

das funktioniert allerdings nur, wenn ich schon in der Tabelle "texte" einen Datensatz hab mit ausgefüllten id, namen_id, und lang_id Feldern...
das Problem ist, dass es diesen Datensatz ja noch garnicht gibt.
oh, ich schätze mal ich hab das flasch verstanden ;)

in dem fall is atrox' beispiel ja schon richtig, nur muss es natürlich auch richtig angewendet werden (des beispiel is von der mysql-doku iirc - richtig atrox? :D)

so ungefähr
Code:
SELECT namen.id,namen.name FROM namen
LEFT OUTER JOIN texte ON namen.id=texte.namenid
WHERE texte.namensid IS NULL;

hth ;)

atrox

in fairy dust... I trust!
Avatar
Registered: Sep 2002
Location: HTTP/1.1 404
Posts: 2782
Zitat von Maehmann
hmmm ... ganz versteh ichs nicht ... die eine tabelle heißt
"namen" und die zweite heißt "texte"
hättest auch schon weiter oben schreiben können.

ich wollte dir wegweiser sein, für eine fixfertige lösung und getestet ist halt nicht immer drin. (zeit und so...)

hätte noch die url zur doku hinzufügen sollen, mein fehler.

Maehmann

OC Addicted
Avatar
Registered: Aug 2002
Location: Vienna
Posts: 1110
okay danke ... werd mir das heut am Abend anschauen ... jetzt heißts Mathe lernen gehen ... god damn it ;)

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
Zitat von Maehmann
okay danke ... werd mir das heut am Abend anschauen ... jetzt heißts Mathe lernen gehen ... god damn it ;)
hmm, ich bin irgendwie scho a kipferl... jetz hab ich schowieder die lang vergessen :D
Code:
SELECT namen.id,namen.name FROM namen
LEFT OUTER JOIN texte ON namen.id=texte.namenid
 AND texte.lang='{$_SESSION[lang_id]}'
WHERE texte.namensid IS NULL AND texte.lang IS NULL
das is tatsächlich nicht grad einfach, sollte aber so funken... *schweissvonderstirnwisch* :D

Maehmann

OC Addicted
Avatar
Registered: Aug 2002
Location: Vienna
Posts: 1110
Zitat von watchout
Code:
SELECT namen.id,namen.name FROM namen
LEFT OUTER JOIN texte ON namen.id=texte.namenid
 AND texte.lang='{$_SESSION[lang_id]}'
WHERE texte.namensid IS NULL AND texte.lang IS NULL

Yeah :D

Big THX ... das funktioniert, soweit ich das auf die schnelle beurteilen kann :)
*gleichweiterprogrammier*

Edit:

Wenn ich mehr Zeit hab, muss ich mir nochmal genau anschauen, was der Query jetzt genau macht ^^
Bearbeitet von Maehmann am 22.09.2003, 18:46

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
geil, das funkt? :D ich habs eigentlich net geglaubt, hab mir joins eben das erste mal geben :D :p

atrox

in fairy dust... I trust!
Avatar
Registered: Sep 2002
Location: HTTP/1.1 404
Posts: 2782
die funktionsweise ist leicht erklärt: beim outer join wird für jeden nicht vorhandenen datensatz im join ein datensatz mit lauter null-werten erzeugt - so daß der join trotzdem klappt.
fragt man nun nach genau diesem null-wert ab, erhält man quasi alle nicht-vorhandenen joins.

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
Zitat von atrox
die funktionsweise ist leicht erklärt: beim outer join wird für jeden nicht vorhandenen datensatz im join ein datensatz mit lauter null-werten erzeugt - so daß der join trotzdem klappt.
fragt man nun nach genau diesem null-wert ab, erhält man quasi alle nicht-vorhandenen joins.
also, laut doku geht das gleiche auch mit nem innerjoin...

Maehmann

OC Addicted
Avatar
Registered: Aug 2002
Location: Vienna
Posts: 1110
Zitat von watchout
geil, das funkt? :D ich habs eigentlich net geglaubt, hab mir joins eben das erste mal geben :D :p

bevor ich hier gepostet hab, hab ich mir das mit den joins auch angesehen ... aber nie einen funkenden query zamgebracht ;) :bash:

g0t glückstreffer? :D

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
Zitat von Maehmann
bevor ich hier gepostet hab, hab ich mir das mit den joins auch angesehen ... aber nie einen funkenden query zamgebracht ;) :bash:

g0t glückstreffer? :D
bei mir gibts sowas nicht :D
(tatsächlich gibts bei mir nur "pechstreffer"...)

naja, hab mich auch mehrere stunden mit deinem query beschäftigt ;)
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz