2 Schlüssel-Abfrage

2 Schlüssel-Abfrage

am 24.03.2006 09:03:07 von Michael Jansen

Hallo,
Ich habe 2 Tabellen->
1: Tabelle 'abc' Attr: 'abc_id' und 'abc_namen'
2: Tabelle 'xyz' Attr: 'abc_gestern' und 'abc_heute'. Beide verweisen
auf abc_id und können natürlich verschiedene Werte annehmen. WIe komme
ich nun mittels SELECT FROM xyz an die Namen aus Tab. 1 ? Mit Join komme
ich doch immer nur an einen Wert aus 1?

Danke und Gruß
Michael

Re: 2 Schlüssel-Abfrage

am 24.03.2006 09:19:22 von Christian Kirsch

Michael Jansen schrieb:
> Hallo,
> Ich habe 2 Tabellen->
> 1: Tabelle 'abc' Attr: 'abc_id' und 'abc_namen'
> 2: Tabelle 'xyz' Attr: 'abc_gestern' und 'abc_heute'. Beide verweisen
> auf abc_id und können natürlich verschiedene Werte annehmen. WIe komme
> ich nun mittels SELECT FROM xyz an die Namen aus Tab. 1 ? Mit Join komme
> ich doch immer nur an einen Wert aus 1?
>

Wenn Du statt Prosa einfach
SHOW CREATE TABLE abc
und
SHOW CREATE TABLE xyz

posten würdest, zusammen mit dem SELECT, das nicht das tut, was Du
willst, dann könnte man Dir leichter helfen. So z.B. verstehe ich
nicht, was 'beide verweisen auf abc_id' bedeuten soll - in der 2.
Tabelle gibt es gar nichts, was als ID interpretierbar wäre.

Re: 2 Schlüssel-Abfrage

am 24.03.2006 10:32:47 von Thomas Rachel

Michael Jansen wrote:

> Hallo,
> Ich habe 2 Tabellen->
> 1: Tabelle 'abc' Attr: 'abc_id' und 'abc_namen'
> 2: Tabelle 'xyz' Attr: 'abc_gestern' und 'abc_heute'. Beide verweisen
> auf abc_id und können natürlich verschiedene Werte annehmen. WIe komme
> ich nun mittels SELECT FROM xyz an die Namen aus Tab. 1 ? Mit Join komme
> ich doch immer nur an einen Wert aus 1?


Wenn ich Dich richtig vestehe, sind abc_gestern und abc_heute IDs?

Dann kriegst Du das mit

SELECT * FROM
xyz JOIN abc AS gestern ON (gestern.abc_id=xyz.abc_gestern)
JOIN abc AS heute ON (heute.abc_id=xyz.abc_heute)
;

hin (ungetestet)


HTH,

Thomas

Re: 2 Schlüssel-Abfrage

am 24.03.2006 16:23:45 von Michael Jansen

Christian Kirsch schrieb:
> Michael Jansen schrieb:
>> Hallo,

> Wenn Du statt Prosa einfach
> SHOW CREATE TABLE abc
> und
> SHOW CREATE TABLE xyz
>
> posten würdest, zusammen mit dem SELECT, das nicht das tut, was Du
> willst, dann könnte man Dir leichter helfen.
;-) OK Beispiel:
CREATE TABLE `dessert` (`dessert_id` INT,`dessert` VARCHAR) ;

INSERT INTO `dessert` ( `dessert_id` , `dessert` )VALUES (NULL
,'Schokoladen-Mousse'), (NULL , 'Vanillepudding');

CREATE TABLE `mensch` ('name',`lieblingsdessert_2005
INT`,`lieblingsdessert_2006` INT);

INSERT INTO mensch
('name','lieblingsdessert_2005','lieblingsdessert_2006') VALUES
('meier',1,2);

Jetzt will ich die Namen der Lieblingsdesserts von Meier.

Gruß
Michael

Re: 2 Schlüssel-Abfrage

am 24.03.2006 16:32:50 von Christian Kirsch

Michael Jansen schrieb:
> Christian Kirsch schrieb:
>> Michael Jansen schrieb:
>>> Hallo,
>
>> Wenn Du statt Prosa einfach
>> SHOW CREATE TABLE abc
>> und
>> SHOW CREATE TABLE xyz
>>
>> posten würdest, zusammen mit dem SELECT, das nicht das tut, was Du
>> willst, dann könnte man Dir leichter helfen.
> ;-) OK Beispiel:
> CREATE TABLE `dessert` (`dessert_id` INT,`dessert` VARCHAR) ;
>
> INSERT INTO `dessert` ( `dessert_id` , `dessert` )VALUES (NULL
> ,'Schokoladen-Mousse'), (NULL , 'Vanillepudding');
>
> CREATE TABLE `mensch` ('name',`lieblingsdessert_2005
> INT`,`lieblingsdessert_2006` INT);
>
> INSERT INTO mensch
> ('name','lieblingsdessert_2005','lieblingsdessert_2006') VALUES
> ('meier',1,2);
>
> Jetzt will ich die Namen der Lieblingsdesserts von Meier.

Flasches Tabellendesign. Bei so einer Struktur musst Du 'mensch' im
nächsten Jahr um eine Spalte erweitern. 2008 dann wieder ...

CREATE TABLE dessert (id, name);
CREATE TABLE mensch (id, name);
CREATE TABLE dessert_mensch (id, dessert_id, mensch_id);

SELECT mensch, GROUP_CONCAT(d.name)
FROM mensch m, dessert d, dessert_mensch md
WHERE m.id = md.mensch_id
AND d.id = md.dessert_id
AND m.name = 'meier';

oder

SELECT d.name
FROM mensch m, dessert d, dessert_mensch md
WHERE m.id = md.mensch_id
AND d.id = md.dessert_id
AND m.name = 'meier';


TIMTOWTDI, natürlich.

Re: 2 Schlüssel-Abfrage

am 24.03.2006 16:35:30 von Johannes Vogel

Hi Michael

Michael Jansen wrote:
> CREATE TABLE `dessert` (`dessert_id` INT,`dessert` VARCHAR) ;
> INSERT INTO `dessert` ( `dessert_id` , `dessert` )VALUES (NULL
> ,'Schokoladen-Mousse'), (NULL , 'Vanillepudding');
> CREATE TABLE `mensch` ('name',`lieblingsdessert_2005
> INT`,`lieblingsdessert_2006` INT);
> INSERT INTO mensch
> ('name','lieblingsdessert_2005','lieblingsdessert_2006') VALUES
> ('meier',1,2);
> Jetzt will ich die Namen der Lieblingsdesserts von Meier.

Die Lösung hat dir ja Thomas bereits geschrieben:

select m.name, d1.dessert as 2005, d2.dessert as 2006
from mensch as m
join dessert as d1 on m.lieblingsdesser_2005=d1.dessert_id
join dessert as d2 on m.lieblingsdesser_2006=d2.dessert_id
order by m.name;

Mit anderen Worten, du kannst eine Tabelle "beliebig oft" joinen.

HTH, Johannes

Re: 2 Schlüssel-Abfrage

am 25.03.2006 12:34:01 von Axel Schwenke

Christian Kirsch wrote:
> Michael Jansen schrieb:

>> CREATE TABLE `dessert` (`dessert_id` INT,`dessert` VARCHAR) ;
>> CREATE TABLE `mensch` ('name',`lieblingsdessert_2005
>> INT`,`lieblingsdessert_2006` INT);
>>
>> Jetzt will ich die Namen der Lieblingsdesserts von Meier.
>
> Flasches Tabellendesign. Bei so einer Struktur musst Du 'mensch' im
> nächsten Jahr um eine Spalte erweitern. 2008 dann wieder ...
>
> CREATE TABLE dessert (id, name);
> CREATE TABLE mensch (id, name);
> CREATE TABLE dessert_mensch (id, dessert_id, mensch_id);

Wenn man dem Original-Ansatz folgt, wäre die Verknüpfungstabelle eher

CREATE TABLE mensch_dessert (mensch_id, jahr, dessert_id,
primary key (mensch_id, jahr))


XL