Mysql Query Problem

Seite 1 von 2 - Forum: Coding Stuff auf overclockers.at

URL: https://www.overclockers.at/coding-stuff/mysql_query_problem_93258/page_1 - zur Vollversion wechseln!


Maehmann schrieb am 21.09.2003 um 18:40

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 schrieb am 21.09.2003 um 18:49

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 schrieb am 21.09.2003 um 19:05

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 schrieb am 21.09.2003 um 21:42

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...


Maehmann schrieb am 21.09.2003 um 23:30

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 schrieb am 22.09.2003 um 02:17

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 schrieb am 22.09.2003 um 03:39

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 schrieb am 22.09.2003 um 07:30

okay danke ... werd mir das heut am Abend anschauen ... jetzt heißts Mathe lernen gehen ... god damn it ;)


watchout schrieb am 22.09.2003 um 12:44

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 schrieb am 22.09.2003 um 18:38

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 ^^


watchout schrieb am 22.09.2003 um 19:01

geil, das funkt? :D ich habs eigentlich net geglaubt, hab mir joins eben das erste mal geben :D :p


atrox schrieb am 22.09.2003 um 21:27

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 schrieb am 23.09.2003 um 00:59

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 schrieb am 23.09.2003 um 07:50

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 schrieb am 23.09.2003 um 13:35

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 ;)




overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2026