MySQL Statement

MySQL Statement

am 28.12.2006 23:05:50 von Peter Sengelmann

Moin,

gibts hier eine elegante Lösung? Ich habe eine Tabelle, in der
Städtenamen drin stehen. Die landesspezifischen Namen haben keinen
Laendercode, weicht der Name in einer Sprache von den landesspezifischen
Namen ab, gibt es einen weiteren Datensatz.

Jetzt möchte ich per SQL-Statement z.B. die deutschen Namen
rausbekommen, wie mache ich dieses, per Laendercode kann ich ja nicht
einschränken....

Tabelle1
Code
DEHAM
CZPRG

Tabelle2
Code,Laendercode,Stadtname
DEHAM Hamburg
CZPRG Praha
CZPRG DE Prag
CZPRG EN Prague

SELECT
Tabelle1.Code
Tabelle2.Stadtname
FROM
Tabelle1
LEFT JOIN
Tabelle1
ON
Tabelle1.Code = Tabelle2.Code

Ergebnis
DEHAM Hamburg
CZPRG Praha
CZPRG Prag

Möchte hier aber nur den DE Prag Datensatz rausbekommen....

Schon mal vielen Dank
Peter

Re: MySQL Statement

am 29.12.2006 00:27:06 von Dominik Echterbruch

Peter Sengelmann wrote:
>
> gibts hier eine elegante Lösung? Ich habe eine Tabelle, in der
> Städtenamen drin stehen. Die landesspezifischen Namen haben keinen
> Laendercode, weicht der Name in einer Sprache von den landesspezifischen
> Namen ab, gibt es einen weiteren Datensatz.
>
> Jetzt möchte ich per SQL-Statement z.B. die deutschen Namen
> rausbekommen, wie mache ich dieses, per Laendercode kann ich ja nicht
> einschränken....
>
> Tabelle1
> Code
> DEHAM
> CZPRG
>
> Tabelle2
> Code,Laendercode,Stadtname
> DEHAM Hamburg
> CZPRG Praha
> CZPRG DE Prag
> CZPRG EN Prague

Ich würde hier einfach schreiben
SELECT code, stadtname
FROM tabelle2
WHERE code LIKE 'DE%'
OR laendercode = 'DE'

Die Tabelle tabelle1 kannst du ja immer noch dazu joinen, wenn du Daten
davon brauchst. Aber mit der oben stehenden Struktur ist das ja an sich
nicht nötig. Oder ist das zu einfach gedacht?

> SELECT
> Tabelle1.Code
> Tabelle2.Stadtname
> FROM
> Tabelle1
> LEFT JOIN
> Tabelle1
> ON
> Tabelle1.Code = Tabelle2.Code
>
> Ergebnis
> DEHAM Hamburg
> CZPRG Praha
> CZPRG Prag

Das halte ich für ein Gerücht. Mit oben genannten Daten kommt selbst
nach Korrektur des Tabellennamens im LEFT JOIN noch was anderes raus.

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: MySQL Statement

am 29.12.2006 12:42:37 von Peter Sengelmann

Dominik Echterbruch schrieb:
> Peter Sengelmann wrote:
>> gibts hier eine elegante Lösung? Ich habe eine Tabelle, in der
>> Städtenamen drin stehen. Die landesspezifischen Namen haben keinen
>> Laendercode, weicht der Name in einer Sprache von den
>> landesspezifischen Namen ab, gibt es einen weiteren Datensatz.
>> Jetzt möchte ich per SQL-Statement z.B. die deutschen Namen
>> rausbekommen, wie mache ich dieses, per Laendercode kann ich ja nicht
>> einschränken....
>> Tabelle1
>> Code
>> DEHAM
>> CZPRG
>> Tabelle2
>> Code,Laendercode,Stadtname
>> DEHAM Hamburg
>> CZPRG Praha
>> CZPRG DE Prag
>> CZPRG EN Prague
> Ich würde hier einfach schreiben
> SELECT code, stadtname
> FROM tabelle2
> WHERE code LIKE 'DE%'
> OR laendercode = 'DE'
>
> Die Tabelle tabelle1 kannst du ja immer noch dazu joinen, wenn du Daten
> davon brauchst. Aber mit der oben stehenden Struktur ist das ja an sich
> nicht nötig. Oder ist das zu einfach gedacht?
Danke Dominik,

das ist aber leider zu einfach gedacht. Tabelle2 war nur ein Auszug und
das Statement ist auch wesentlich komplexer, brauche den JOIN, um
weitere Einschränkungen zu machen

Tabelle1
DEHAM
CZPRG
USBOS
PELIM

Tabelle2
Code,Laendercode,Stadtname
DEHAM Hamburg
CZPRG Praha
CZPRG DE Prag
CZPRG EN Prague
USBOS Bosten
PELIM Lima
.....

Gewünschtes Ergebnis für Deutsch
DEHAM Hamburg
CZPRG Prag !!!!!
USBOS Bosten
PELIM Lima

Gewünschtes Ergebnis für Englisch
DEHAM Hamburg
CZPRG Prague !!!!!
USBOS Bosten
PELIM Lima


>> SELECT
>> Tabelle1.Code
>> Tabelle2.Stadtname
>> FROM
>> Tabelle1
>> LEFT JOIN
>> Tabelle1
>> ON
>> Tabelle1.Code = Tabelle2.Code
>> Ergebnis
>> DEHAM Hamburg
>> CZPRG Praha
>> CZPRG Prag

> Das halte ich für ein Gerücht. Mit oben genannten Daten kommt selbst
> nach Korrektur des Tabellennamens im LEFT JOIN noch was anderes raus.
Stimmt, hier das korrekte Statement
SELECT
Tabelle1.Code,
Tabelle2.Stadtname
FROM
Tabelle1
LEFT JOIN
Tabelle2
ON
Tabelle1.Code = Tabelle2.Code

Ergebnis
CZPRG Praha
CZPRG Prag
CZPRG Prague
DEHAM Hamburg
PELIM Lima
USBOS Boston

Möchte aber je nach Sprachwahl bei CZPRG entweder den nativen, den
deutschen oder englischen Namen haben.....

Gruß
Peter

Re: MySQL Statement

am 29.12.2006 13:06:07 von Johannes Vogel

Hi Peter

Peter Sengelmann wrote:
> gibts hier eine elegante Lösung? Ich habe eine Tabelle, in der
> Städtenamen drin stehen. Die landesspezifischen Namen haben keinen
> Laendercode, weicht der Name in einer Sprache von den landesspezifischen
> Namen ab, gibt es einen weiteren Datensatz.
> Jetzt möchte ich per SQL-Statement z.B. die deutschen Namen
> rausbekommen, wie mache ich dieses, per Laendercode kann ich ja nicht
> einschränken....
> Möchte hier aber nur den DE Prag Datensatz rausbekommen....

Ansatz:
Sortieren auf Laendercode und Gruppieren auf Code:
select * from (
select ... from ... where ...
and (laendercode='DE' or laendercode='' or laendercode is null)
order by laendercode) as e
group by code;

Beachte, dass group by jeweils den ersten einer Übereinstimmung benutzt
und nutze order by mit asc oder desc, so dass DE vor '' und NULL
einsortiert wird. Achtung: Dies ist nicht dokumentiert und kann in
Zukunft ändern.

HTH; Johannes

Re: MySQL Statement

am 29.12.2006 13:15:57 von Andreas Sakowski

Hallo

"Peter Sengelmann" schrieb
> gibts hier eine elegante Lösung? Ich habe eine Tabelle, in der
> Städtenamen drin stehen. Die landesspezifischen Namen haben keinen
> Laendercode, weicht der Name in einer Sprache von den
> landesspezifischen Namen ab, gibt es einen weiteren Datensatz.
>
> Jetzt möchte ich per SQL-Statement z.B. die deutschen Namen
> rausbekommen, wie mache ich dieses, per Laendercode kann ich ja
> nicht einschränken....

Vielleicht ist

select
if( b.stadtname is null , a.stadtname , b.stadtname )
from tabelle2 a
left join tabelle2 b on b.code = a.code and b.laendercode = 'DE'
where a.laendercode = ''

das was Du suchst.

Gruß
Andreas

Re: MySQL Statement

am 29.12.2006 14:45:44 von Thomas Rachel

Peter Sengelmann wrote:

>>> Tabelle1
>>> Code
>>> DEHAM
>>> CZPRG
>>> Tabelle2
>>> Code,Laendercode,Stadtname
>>> DEHAM Hamburg
>>> CZPRG Praha
>>> CZPRG DE Prag
>>> CZPRG EN Prague

also

create table ta1 (code char(5));
insert into ta1 values ('DEHAM'),('CZPRG');
create table ta2 (code char(5), lang char(2), name varchar(30));
insert into ta2 values ('DEHAM','','Hamburg'),
('CZPRG','','Praha'),
('CZPRG','DE','Prag'),
('CZPRG','EN','Prague');

-- und dann noch die anderen
insert into ta1 values ('USBOS'),('PELIM');
insert into ta2 values
('USBOS','','Bosten'), -- hat das einen bestimmten Grund, warum Du da
Bosten und nicht Boston schreibst?
('PELIM','','Lima');


-- und nun:

set @lang='DE';
SELECT
ta1.code, ifnull(ta2l.name,ta2.name), ta2l.lang
FROM
ta1
LEFT JOIN ta2 ON ta1.code = ta2.code AND ta2.lang=''
LEFT JOIN ta2 AS ta2l ON ta1.code = ta2l.code AND ta2l.lang=@lang;

set @lang='EN';


d.h. es wird versucht, den Namen von ta2l zu nehmen, der nach der
Vorgabesprache gefiltert wurde. Gibt es den jedoch nicht, soll der native
Name genommen werden, der durch '' identifiziert ist.


Erweiterungsvorschlag:
SELECT
ta1.code, ifnull(ta2l.name,ta2.name), ta2l.lang
FROM
ta1
LEFT JOIN ta2 ON ta1.code = ta2.code AND (ta2.lang='' OR
ta2.lang=substring(ta2.code,1,2))
LEFT JOIN ta2 AS ta2l ON ta1.code = ta2l.code AND ta2l.lang=@lang;

Dann kannst Du statt dem leeren String als "Native"-Kennzeichner auch den
Original-Sprachencode verwenden...


Thomas
--
Die Verwendung von mehreren Ausrufezeichen macht die Aussage nicht
ausrufender sondern ausufernder. [Michael Bauer in dnq]

Re: MySQL Statement

am 29.12.2006 19:07:48 von Peter Sengelmann

Moin Thomas,

das ist ja perfekt beschrieben! Vielen vielen Dank!
Genau sowas habe ich gesucht!

Peter

Thomas Rachel schrieb:
> create table ta1 (code char(5));
> insert into ta1 values ('DEHAM'),('CZPRG');
> create table ta2 (code char(5), lang char(2), name varchar(30));
> insert into ta2 values ('DEHAM','','Hamburg'),
> ('CZPRG','','Praha'),
> ('CZPRG','DE','Prag'),
> ('CZPRG','EN','Prague');
>
> -- und dann noch die anderen
> insert into ta1 values ('USBOS'),('PELIM');
> insert into ta2 values
> ('USBOS','','Bosten'), -- hat das einen bestimmten Grund, warum Du da
> Bosten und nicht Boston schreibst? //
Sorry, ist ein Schreibfehler, natürlich Boston.....

> ('PELIM','','Lima');
>
>
> -- und nun:
>
> set @lang='DE';
> SELECT
> ta1.code, ifnull(ta2l.name,ta2.name), ta2l.lang
> FROM
> ta1
> LEFT JOIN ta2 ON ta1.code = ta2.code AND ta2.lang=''
> LEFT JOIN ta2 AS ta2l ON ta1.code = ta2l.code AND ta2l.lang=@lang;
>
> set @lang='EN';
>
>
> d.h. es wird versucht, den Namen von ta2l zu nehmen, der nach der
> Vorgabesprache gefiltert wurde. Gibt es den jedoch nicht, soll der native
> Name genommen werden, der durch '' identifiziert ist.
>
>
> Erweiterungsvorschlag:
> SELECT
> ta1.code, ifnull(ta2l.name,ta2.name), ta2l.lang
> FROM
> ta1
> LEFT JOIN ta2 ON ta1.code = ta2.code AND (ta2.lang='' OR
> ta2.lang=substring(ta2.code,1,2))
> LEFT JOIN ta2 AS ta2l ON ta1.code = ta2l.code AND ta2l.lang=@lang;
>
> Dann kannst Du statt dem leeren String als "Native"-Kennzeichner auch den
> Original-Sprachencode verwenden...
>
>
> Thomas

Re: MySQL Statement

am 29.12.2006 19:19:46 von Peter Sengelmann

Andreas Sakowski schrieb:
> Hallo
> "Peter Sengelmann" schrieb
>> gibts hier eine elegante Lösung? Ich habe eine Tabelle, in der
>> Städtenamen drin stehen. Die landesspezifischen Namen haben keinen
>> Laendercode, weicht der Name in einer Sprache von den
>> landesspezifischen Namen ab, gibt es einen weiteren Datensatz.
>> Jetzt möchte ich per SQL-Statement z.B. die deutschen Namen
>> rausbekommen, wie mache ich dieses, per Laendercode kann ich ja
>> nicht einschränken....
> Vielleicht ist
> select
> if( b.stadtname is null , a.stadtname , b.stadtname )
> from tabelle2 a
> left join tabelle2 b on b.code = a.code and b.laendercode = 'DE'
> where a.laendercode = ''
> das was Du suchst.
> Gruß
> Andreas
Hi Andreas,

genau sowas habe ich gesucht! Vielen Dank

Peter