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