select - komme nicht weiter

select - komme nicht weiter

am 18.07.2006 17:24:15 von xylux

.... sehe den Wald vor lauter Bäumen nicht:

Ich habe eine Tabelle adr mit Adressen die verschiedenen Kategorien in der
Tabelle kategorie_schl zugeordnet sind.
Der User kann über Checkboxen in der Applikation Kategorien auswählen und
sich die zugehörigen Adressdatensätze anzeigen lassen.
Wenn z.B. 2 Kategorien ausgewählt werden und diese mit einem ODER verknüpft
werden (siehe unten) funktioniert das:

(Alles auf das Nötigste reduziert)

table adr
___________________
id_adr
LastName
FirstName


table kategorie
____________
id_kategorie
kategoriename


table kategorie_schl
______________________
id
id_adr
id_kategorie


SELECT DISTINCT id_adr, LastName, FirstName,
kategorie_schl.id_kategorie
FROM adr, kategorie_schl
WHERE adr.id = kategorie_schl.id_adr
AND (
kategorie_schl.id_kategorie =5
OR kategorie_schl.id_kategorie =4
)


Eine UND-Verknüpfung hat als Resultat 0 Datensätze obwohl Datensätze mit
diesen Kriterien vorhanden sind.
Also:

.... WHERE adr.id = kategorie_schl.id_adr
AND
(
kategorie_schl.id_kategorie =5
!>AND kategorie_schl.id_kategorie =4
)

funktioniert so nicht.

Ziel: Es sollen nur die DS augegeben werden, die beiden Kategorien
zugeordnet sind.

Wie formuliere ich das am einfachsten?

Hoffe, ich habe mich einigermaßen verständlich machen könne.
Wäre nett, wenn mir jemand weiterhelfen könnte.

Gruß
Hans

Re: select - komme nicht weiter

am 18.07.2006 21:06:21 von Dominik Echterbruch

H.Armgart wrote:
> ... sehe den Wald vor lauter Bäumen nicht:
>
> Ich habe eine Tabelle adr mit Adressen die verschiedenen Kategorien in der
> Tabelle kategorie_schl zugeordnet sind.
> Der User kann über Checkboxen in der Applikation Kategorien auswählen und
> sich die zugehörigen Adressdatensätze anzeigen lassen.
>
> table adr
> ___________________
> id_adr
> LastName
> FirstName
>
> table kategorie
> ____________
> id_kategorie
> kategoriename
>
> table kategorie_schl
> ______________________
> id
> id_adr
> id_kategorie
>
> Eine UND-Verknüpfung hat als Resultat 0 Datensätze obwohl Datensätze mit
> diesen Kriterien vorhanden sind.
> Also:
>
> ... WHERE adr.id = kategorie_schl.id_adr
> AND
> (
> kategorie_schl.id_kategorie =5
> !>AND > kategorie_schl.id_kategorie =4
> )
>
> funktioniert so nicht.

Das funktioinert schon, liefert nur nicht das Ergebnis, das du dir
vorstellst ;) Und nein, es sind eben keine Datrensätze vorhanden, für
die im Feld id_kategorie *gleichzeitig* zwei verschiedene Werte stehen.

> Ziel: Es sollen nur die DS augegeben werden, die beiden Kategorien
> zugeordnet sind.

Dann mußt du die Kategorientabelle so oft mit den Adressen joinen, wie
Kategorien ausgewählt sind. Mal ein bißchen aufgehübscht:

SELECT DISTINCT adr.id_adr, adr.LastName, adr.FirstName, a.id_kategorie,
b.id_kategorie
FROM adr
INNER JOIN kategorie_schl a ON adr.id = a.id_adr
INNER JOIN kategorie_schl b ON adr.id = b.id_adr
WHERE a.id_kategorie = 5
AND b.id_kategorie = 4


Grüße,
Dominik
--
Norbert Melzer in d.c.d.mysql:
F: Wie verstehe ich diese FAQ am besten?
A: Studieren Sie Datanbank-Design und lesen Sie anschliessend alles nochmal

Re: select - komme nicht weiter

am 19.07.2006 19:56:12 von xylux

"Dominik Echterbruch" schrieb
> Dann mußt du die Kategorientabelle so oft mit den Adressen joinen, wie
> Kategorien ausgewählt sind. Mal ein bißchen aufgehübscht:

Vielen Dank, hast mir sehr geholfen. Das funktioniert nun.

So richtig kapiert habe ich allerdings noch nicht, was hier passiert.
> INNER JOIN kategorie_schl a ON adr.id = a.id_adr
> INNER JOIN kategorie_schl b ON adr.id = b.id_adr

a.id_adr ist eine temporäre Tabelle?
Weiß jetzt, wo ich ansetzen kann und werde nochmals ein Handbuch lesen.

Gruß

Hans

Re: select - komme nicht weiter

am 19.07.2006 20:56:09 von Thomas Rachel

H.Armgart wrote:

> So richtig kapiert habe ich allerdings noch nicht, was hier passiert.

>> INNER JOIN kategorie_schl a ON adr.id = a.id_adr
>> INNER JOIN kategorie_schl b ON adr.id = b.id_adr
>
> a.id_adr ist eine temporäre Tabelle?

Deine Umlaute sind defekt (falsch deklariert). Bitte konfiguriere Deinen
Newsreader richtig.

Nein, a ist ein alias für kategorie_schl. Das ist nötig, da diese Tabelle
2x gejoint werden muß, von daher liegt es nahe, die Bezeichner a und b
dafür zu nehmen. Näheres erfährst Du aus dem Handbuch, Link wurde
bereits des öfteren in dieser NG gepostet.

Temporäre Tabellen funktionieren mit CREATE TEMPORARY TABLE (und können
AFAIR *nicht* mehrfach geJOINt werden).

HTH,

Thomas

Re: select - komme nicht weiter

am 19.07.2006 22:21:52 von Dominik Echterbruch

Thomas Rachel wrote:
>
>>>INNER JOIN kategorie_schl a ON adr.id = a.id_adr
>>
>>a.id_adr ist eine temporäre Tabelle?
>
> Deine Umlaute sind defekt (falsch deklariert). Bitte konfiguriere Deinen
> Newsreader richtig.

Dafür ist deine From-Adresse Ende Mai abgelaufen ;)

> Nein, a ist ein alias für kategorie_schl. Das ist nötig, da diese Tabelle
> 2x gejoint werden muß, von daher liegt es nahe, die Bezeichner a und b
> dafür zu nehmen. Näheres erfährst Du aus dem Handbuch, Link wurde
> bereits des öfteren in dieser NG gepostet.
>
> Temporäre Tabellen funktionieren mit CREATE TEMPORARY TABLE (und können
> AFAIR *nicht* mehrfach geJOINt werden).

Wzbw... Aber da ich es selber nicht besser weiß, will ich mal nicht
widersprechen (wenn mir auch kein sinnvoller Grund einfallen will, warum
das so sein sollte).


Grüße,
Dominik
--
Norbert Melzer in d.c.d.mysql:
F: Wie verstehe ich diese FAQ am besten?
A: Studieren Sie Datanbank-Design und lesen Sie anschliessend alles nochmal

Re: select - komme nicht weiter

am 19.07.2006 23:37:46 von Thomas Rachel

Dominik Echterbruch wrote:

> Dafür ist deine From-Adresse Ende Mai abgelaufen ;)

Ups. Sollte jetzt korrigiert sein.

>> Temporäre Tabellen funktionieren mit CREATE TEMPORARY TABLE (und
>> können AFAIR *nicht* mehrfach geJOINt werden).
>
> Wzbw... Aber da ich es selber nicht besser weiß, will ich mal nicht
> widersprechen (wenn mir auch kein sinnvoller Grund einfallen will,
> warum das so sein sollte).

http://dev.mysql.com/doc/refman/4.0/de/temporary-table-probl ems.html
http://dev.mysql.com/doc/refman/5.1/de/temporary-table-probl ems.html

| Eine TEMPORARY-Tabelle kann nicht mehrmals in derselben Anfrage benutzt
| werden. Das Folgende funktioniert beispielsweise nicht:
|
| mysql> SELECT * FROM temp_table, temp_table AS t2;
| ERROR 1137: Can't reopen table: 'temp_table'

HTH,

Thomas

Re: select - komme nicht weiter

am 20.07.2006 00:23:47 von Dominik Echterbruch

Thomas Rachel wrote:
>
>>Dafür ist deine From-Adresse Ende Mai abgelaufen ;)
>
> Ups. Sollte jetzt korrigiert sein.

Jup, sieht gut aus.

> http://dev.mysql.com/doc/refman/4.0/de/temporary-table-probl ems.html
> http://dev.mysql.com/doc/refman/5.1/de/temporary-table-probl ems.html
>
> | Eine TEMPORARY-Tabelle kann nicht mehrmals in derselben Anfrage benutzt
> | werden. Das Folgende funktioniert beispielsweise nicht:
> |
> | mysql> SELECT * FROM temp_table, temp_table AS t2;
> | ERROR 1137: Can't reopen table: 'temp_table'

OK, ich seh's ein. Gut, daß ich nicht widersprochen hab ;)


Grüße,
Dominik
--
Norbert Melzer in d.c.d.mysql:
F: Wie verstehe ich diese FAQ am besten?
A: Studieren Sie Datanbank-Design und lesen Sie anschliessend alles nochmal

Re: select - komme nicht weiter

am 20.07.2006 07:20:51 von xylux

"Thomas Rachel" schrieb

> Deine Umlaute sind defekt (falsch deklariert). Bitte konfiguriere Deinen
> Newsreader richtig.
Hoffe, jetzt funktionierts.

> Näheres erfährst Du aus dem Handbuch, Link wurde
> bereits des öfteren in dieser NG gepostet.

Bereits gefunden. Danke

Gruß
Hans