Abfrageergebnis wenn eine verbundene Tabelle leeren Datensatz enthält

Abfrageergebnis wenn eine verbundene Tabelle leeren Datensatz enthält

am 24.02.2006 08:32:20 von Hans Winkler

Aus den Tabellen Adress und Komunika ziehe ich Daten mit folgender Abfrae:
SELECT
`adress`.`kdnr`,`adress`.`suchbegrif`,`komunika`.`was`,`komu nika`.`eintrag`,`komunika`.`wer`
FROM `komunika`,`adress` WHERE ((`adress`.`".$_REQUEST['spaltestr']."`
LIKE '" . $_REQUEST['suchstr'] . "%') and
`adress`.`kdnr`=`komunika`.`kdnr`) ORDER by
`adress`.`suchbegrif`,`komunika`.`was`";

Wenn es in der Tabelle Komunika keinen passenden Wert gibt, ist das
Gesamtergebnis leer. Das ist unerwünscht! Wie kann ich die Abfrage
gestalten, das wenigstens die Angaben aus Adress ausgegeben werden?

Hans

Re: Abfrageergebnis wenn eine verbundene Tabelle leeren Datensatz enthält

am 24.02.2006 08:41:33 von Helmut Chang

Hans Winkler schrieb:

> Wenn es in der Tabelle Komunika keinen passenden Wert gibt, ist das
> Gesamtergebnis leer. Das ist unerwünscht! Wie kann ich die Abfrage
> gestalten, das wenigstens die Angaben aus Adress ausgegeben werden?

Du suchst LEFT OUTER JOIN anstatt INNER JOIN.

gruss, heli

Re: Abfrageergebnis wenn eine verbundene Tabelle leeren Datensatz enthält

am 24.02.2006 13:40:16 von Hans Winkler

Helmut Chang schrieb:
> Hans Winkler schrieb:
>
>> Wenn es in der Tabelle Komunika keinen passenden Wert gibt, ist das
>> Gesamtergebnis leer. Das ist unerwünscht! Wie kann ich die Abfrage
>> gestalten, das wenigstens die Angaben aus Adress ausgegeben werden?
>
> Du suchst LEFT OUTER JOIN anstatt INNER JOIN.

Die Abfrage habe ich folgendermaßen modifiziert:

SELECT
`adress`.`kdnr`,`adress`.`suchbegrif`,`komunika`.`was`,`komu nika`.`eintrag`,`komunika`.`wer`
FROM `komunika`,`adress` LEFT OUTER JOIN komunika ON
`adress`.`kdnr`=`komunika`.`kdnr` WHERE
`adress`.`".$_REQUEST['spaltestr']."` LIKE '" . $_REQUEST['suchstr'] .
"%' ORDER by `adress`.`suchbegrif`,`komunika`.`was`";

Jetzt kommt gar kein Eregebnis mehr.

Hans

Re: Abfrageergebnis wenn eine verbundene Tabelle leeren Datensatz enthält

am 24.02.2006 13:47:17 von external.tobias.schuetz

> > Du suchst LEFT OUTER JOIN anstatt INNER JOIN.
>
> Die Abfrage habe ich folgendermaßen modifiziert:
>
> SELECT
>
`adress`.`kdnr`,`adress`.`suchbegrif`,`komunika`.`was`,`komu nika`.`eintrag`,
`komunika`.`wer`
> FROM `komunika`,`adress` LEFT OUTER JOIN komunika ON
[..]
> Jetzt kommt gar kein Eregebnis mehr.

Wie wäre es mit:
.... FROM adress LEFT OUTER JOINkomunika ON ...

Ich kann mir gut vorstellen, dass du keine Ergebnisse mehr bekommst durch
deine Abfrage...

Gruß
Tobias

Re: Abfrageergebnis wenn eine verbundene Tabelle leeren Datensatz enthält

am 24.02.2006 14:06:58 von Hans Winkler

Tobias Schütz [Abt] schrieb:
>>> Du suchst LEFT OUTER JOIN anstatt INNER JOIN.
>> Die Abfrage habe ich folgendermaßen modifiziert:
>>
>> SELECT
>>
> `adress`.`kdnr`,`adress`.`suchbegrif`,`komunika`.`was`,`komu nika`.`eintrag`,
> `komunika`.`wer`
>> FROM `komunika`,`adress` LEFT OUTER JOIN komunika ON
> [..]
>> Jetzt kommt gar kein Eregebnis mehr.
>
> Wie wäre es mit:
> ... FROM adress LEFT OUTER JOINkomunika ON ...
>
> Ich kann mir gut vorstellen, dass du keine Ergebnisse mehr bekommst durch
> deine Abfrage

Aha, so gehts. Mir fällt ein Stein vom Herrzen, aber begriffen habe ich
diese Syntax leider nicht.

Hans

Re: Abfrageergebnis wenn eine verbundene Tabelle leeren Datensatz enthält

am 24.02.2006 14:54:27 von Fabian Schladitz

Hans Winkler schrieb:
> Tobias Schütz [Abt] schrieb:
>=20
>> Wie wäre es mit:
>> ... FROM adress LEFT OUTER JOINkomunika ON ...
>>
>> Ich kann mir gut vorstellen, dass du keine Ergebnisse mehr bekommst du=
rch
>> deine Abfrage
>=20
>=20
> Aha, so gehts. Mir fällt ein Stein vom Herrzen, aber begriffen habe i=
ch=20
> diese Syntax leider nicht.

Ein guter Grund um das Manual von MySQL zu studieren.

--=20
Gruss,
Fabian

Re: Abfrageergebnis wenn eine verbundene Tabelle leeren Datensatz enthält

am 24.02.2006 15:24:38 von Hans Winkler

>> Aha, so gehts. Mir fällt ein Stein vom Herrzen, aber begriffen habe
>> ich diese Syntax leider nicht.
>
> Ein guter Grund um das Manual von MySQL zu studieren.

Sorry, aber eben das hat mich unter dem Stichwort Join nicht weiter
gebracht.
Seltsam, das immer unterstellt wird, man sei zu faul, ein Handbuch zu lesen.

Hans

Re: Abfrageergebnis wenn eine verbundene Tabelle leeren Datensatz enthält

am 24.02.2006 15:37:55 von Fabian Schladitz

Hans Winkler schrieb:
>>> Aha, so gehts. Mir fällt ein Stein vom Herrzen, aber begriffen habe=
=20
>>> ich diese Syntax leider nicht.
>>
>>
>> Ein guter Grund um das Manual von MySQL zu studieren.
>=20
>=20
> Sorry, aber eben das hat mich unter dem Stichwort Join nicht weiter=20
> gebracht.
> Seltsam, das immer unterstellt wird, man sei zu faul, ein Handbuch zu=20
> lesen.

Unter
http://dev.mysql.com/doc/refman/5.0/en/join.html
wird die Syntax genau erklärt und es gibt eine Menge zusätzlich Infos=
=20
über die Interna von MySQL.

Wenn du aber nicht weißt, was ein JOIN ist und wo der Unterschied=20
zwischen INNER und OUTER Join liegt, dann ist das kein syntaktisches=20
Problem, sondern eines des Verständnisses. Und da helfen dir Bücher w=
eiter.

--=20
HTH,
Fabian

Re: Abfrageergebnis wenn eine verbundene Tabelle leeren Datensatz enthält

am 24.02.2006 16:30:55 von Hans Winkler

Fabian Schladitz schrieb:
> Hans Winkler schrieb:
>>>> Aha, so gehts. Mir fällt ein Stein vom Herrzen, aber begriffen habe
>>>> ich diese Syntax leider nicht.
>>>
>>>
>>> Ein guter Grund um das Manual von MySQL zu studieren.
>>
>>
>> Sorry, aber eben das hat mich unter dem Stichwort Join nicht weiter
>> gebracht.
>> Seltsam, das immer unterstellt wird, man sei zu faul, ein Handbuch zu
>> lesen.
>
> Unter
> http://dev.mysql.com/doc/refman/5.0/en/join.html
> wird die Syntax genau erklärt und es gibt eine Menge zusätzlich Infos
> über die Interna von MySQL.
>
> Wenn du aber nicht weißt, was ein JOIN ist und wo der Unterschied
> zwischen INNER und OUTER Join liegt, dann ist das kein syntaktisches
> Problem, sondern eines des Verständnisses. Und da helfen dir Bücher weiter.

Genau diesen Teil des Handbuches meinte ich auch. Freut mich, das Du
damit mehr anfangen kannst als ich. Aber Du hast recht - es gibt auch
noch andere Bücher und Erklärungen.

Hans

Re: Abfrageergebnis wenn eine verbundene Tabelle leeren Datensatz enthält

am 24.02.2006 16:49:02 von Niels Braczek

Hans Winkler schrieb:
> Fabian Schladitz schrieb:

>> Wenn du aber nicht weißt, was ein JOIN ist und wo der Unterschied
>> zwischen INNER und OUTER Join liegt, dann ist das kein syntaktisches
>> Problem, sondern eines des Verständnisses. Und da helfen dir Bücher weiter.
>
> Genau diesen Teil des Handbuches meinte ich auch. Freut mich, das Du
> damit mehr anfangen kannst als ich. Aber Du hast recht - es gibt auch
> noch andere Bücher und Erklärungen.

Das ist doch ganz einfach. Ich schneide das mal kurz in Pappe aus.

Im Prinzip brauchst du nur zwei Arten der Verknüpfung:

1. INNER JOIN -- wird idR nicht explizit angegeben

SELECT a.*, b.* FROM a, b
Jeder Datensatz aus a wird mit jedem Datensatz aus b kombiniert
(kartesisches Produkt).

SELECT a.*, b.* FROM a, b WHERE a.x=b.y
Wie vor; allerdings kommt kein Ergebnis, das nicht in *beiden*
Tabellen eine Entsprechung hat.

2. OUTER JOIN -- hier wird nur LEFT OUTER JOIN gebraucht, das OUTER
wird idR weggelassen.

SELECT a.*, b.* FROM a LEFT JOIN b ON a.x=b.y
Es wird *jeder* Datensatz aus a gelesen und durch den passenden
Eintrag in b ergänzt. Gibt es in b keinen Eintrag, wird statt
dessen für die b-Felder NULL zurückgegeben.

Mehr ist das nicht. Die anderen JOIN-Formen kannst du getrost vergessen.
Man braucht sie nie; zumindest habe ich sie bisher nicht gebraucht --
und ich benutze SQL seit ca. 1989.

MfG
Niels

--
| http://www.kolleg.de · Das Portal der Kollegs in Deutschland |
| http://www.bsds.de · BSDS Braczek Software- und DatenSysteme |
| Webdesign · Webhosting · E-Commerce · Mambo Content Management |
------------------------------------------------------------ ----