Antje Hofmann: mySQL: LEFT JOIN

Beitrag lesen

Hallo Andre

ein typisches Beispiel für eine UNION-Abfrage. Das kann allerdings mysql nicht.

  1. Bsp(noch besser ;-)):
    tab1.id   tab1.name    tab2.info
    1         André        NULL
    1         NULL         123
    1         NULL         145
    1         NULL         156
    2         Swen         Null
    2         NULL         222
    2         NULL         333
    .
    .
    usw.

Auf der Console klappt folgendes:

create temporary table test.tmp (id INT not null, name VARCHAR (100), info VARCHAR (100));insert into test.tmp  select test.tab1.id,Name,'' as info from test.tab1;insert into test.tmp select test.tab2.tab1_id,'' as Name, test.tab2.info as info from test.tab1 left join test.tab2 on test.tab1.id=test.tab2.ta
b1_id;SELECT * from test.tmp order by id;drop table test.tmp;

über php geht das nicht in einem Arbeitsgang. Da benötigst du mehrere Zugriffe:

create temporary table test.tmp (id INT not null, name VARCHAR (100), info VARCHAR (100));

insert into test.tmp  select test.tab1.id,Name,'' as info from test.tab1;

insert into test.tmp select test.tab2.tab1_id,'' as Name, test.tab2.info as info from test.tab1 left join test.tab2 on test.tab1.id=test.tab2.ta
b1_id;
SELECT * from test.tmp order by id;drop table test.tmp;

An sich kann man schon mit dem Createbefehl ein select auf die auszulesende Tabelle ausführen.
z.B. so:

create temporary table test.tmp select test.tab1.id,Name,'NULL' as info from test.tab1;insert into test.tmp select test.tab2.tab1_id,'NULL' as Name, test.tab2.info as info from test.tab1 left join test.tab2 on test.tab1.id=test.tab2.tab1_id;SELECT * from test.tmp order by id;drop table test.tmp;

Zu beachten ist, im ersten Select müssen alle verwendeten Felder angelegt werden. Nullwerte werden da nicht akzeptiert. Auch ist die Feldlänge der temporären Tabelle immer abhängig vom ersten Select.

Persönlich würde ich mich in diesem Fall jedoch für folgende Variante entscheiden:

select tab1.id,Name,info from tab1 left join tab2 on tab1_id=tab1.id order by id

Hier erhälst du zwar keine Nullzellen, aber gleiche Name erfüllen ja prinzipiell den gleichen Effekt. Werte die einen Eintrag in der Tab1 haben und keinen Eintrag in Tab2 werden ja sowieso zurückgegeben.

Mit "SELECT tab1.*, tab2.* FROM tab2 LEFT JOIN tab1 ON
tab1.id=tab2.id;"

^^^^^^^^^^^^^^^^
habe ich es (siehe Link) "ungefähr" geschaft. Problem ist, "André" werden die falschen Infonummern(tab2.info) zugewiesen.

Du hattest hier nur falsch verknüpft.

Viele Grüße

Antje