Sql subselect

Hallo,
ich bin mySQL-Neuling und habe eine Frage zum Thema subselect.
(Zumindest hoffe ich, dass das die Lösug meines Problems ist).
Ich habe eine Tabelle (comprodutos), in der Produkttypen und Produkt-Ids stehen.
Zunächst muss ich alle Produkte finden, deren Produkttyp =2 ist und die Produkt-Ids merken.

Mit den ids muss ich dann in meine zweite Tabelle (comprodutosatribuicoescaracteristicas) gehen und die Werte aus der Spalte Valor auslesen, deren Zeilen sowohl die gefundenen ids enthält, als auch den Wert 435 in einer anderen Spalte.

Ich habe leider keine Ahnung, wie ich das ans Laufen kriege.
Kann da jemand helfen?

mfg,
David

Hallo David,

(Zumindest hoffe ich, dass das die Lösug meines Problems ist).

ist es. (Oder sagen wir so: Eine der möglichen Lösungen setzt ein Subselect ein.)

Ich habe eine Tabelle (comprodutos), in der Produkttypen und
Produkt-Ids stehen.
Zunächst muss ich alle Produkte finden, deren Produkttyp =2
ist und die Produkt-Ids merken.

Den Teil hast du bestimmt schon selbst hinbekommen:

select id
from produkt
where typ = 2

Ergebnis dieser Anfrage sind die gewünschten IDs.

Der Rest lässt sich eins zu eins nach SQL übersetzen, wobei diese IDs an geeigneter Stelle eingebaut werden.

Mit den ids muss ich dann in meine zweite Tabelle
(comprodutosatribuicoescaracteristicas) gehen

from comprodutosatribuicoescaracteristicas

(Wow, was für ein Name; was für eine Sprache ist das? Portugiesisch?)

und die Werte aus der Spalte Valor auslesen,

select Valor

deren Zeilen sowohl die gefundenen ids enthält,

where produkt\_id in (...)

(die drei Punkte sind die Anfrage von oben)

als auch den Wert 435 in einer anderen Spalte.

and andere\_spalte = 435

(Das ganze musst du jetzt natürlich noch in der richtigen Reihenfolge aufschreiben: select, from, where.)

Viele Grüße,

Andreas

Hallo David,

so schwer kann das doch nicht sein… Unter Oracle würde ich das Ganze so anstellen (wenn es denn unbedingt SUBSELECTs sein sollen) - ungetestet, natürlich:

select
 c1.valor
from
 comprodutosatribuicoescaracteristicas c1,
 (
 select
 productid
 from
 comprodutos
 where
 produkttyp = 2
 ) c2
where
 c1.id = c2.productid
 and c1.anderespalte = 435;

BTW: wer denkt sich denn so bescheuerte Tabellennamen aus?

gruss
bernhard

Hallo,

Ich habe eine Tabelle (comprodutos), in der Produkttypen und
Produkt-Ids stehen.
Zunächst muss ich alle Produkte finden, deren Produkttyp =2
ist und die Produkt-Ids merken.

Mit den ids muss ich dann in meine zweite Tabelle
(comprodutosatribuicoescaracteristicas) gehen und die Werte
aus der Spalte Valor auslesen, deren Zeilen sowohl die
gefundenen ids enthält, als auch den Wert 435 in einer anderen
Spalte.

Wenn ich dich richtig verstehe, brauchst du da eher einen Join. Mit Subselect gehts sicher auch, aber wir haben mal gelernt, der sei aus Performancegründen nie dem Join vorzuziehen :wink:

Select * from c inner join c2 on c.typ = c2.typ where c.typ = 2 and c2.s = 435

Ungeprüft, aber sollte mE zum Ergebnis führen.

Gruß, Leebo

Moin, Bernhard,

BTW: wer denkt sich denn so bescheuerte Tabellennamen aus?

comprodutosatribuicoescaracteristicas heißt mitProduktattributeigenschaften - vielleicht ein Brasilianer, frisch aus dem Modellierungskurs :smile:))

Gruß Ralf

gruss
bernhard

1 Like

Hallo,
das war ein oder mehrere Portugiese(n) der sich das ausgedacht hat.
Das führt auf jeden Fall schonmal zu 10x mahe Schreibfehlern in meiner Syntax…

Ralf, du bekommst also jetzt einen immer besseren Überblick über das Chaos in dieser DB.
Das „com“ am Anfang hat aber in diesem Fall eine andere Bedeutung. Was dieses Prefix soll, weiß ich auch noch nicht. Da aber jedes Produkt auch mir Produkteigenschaften versehen ist, bedeutet das in diesem Fall nicht „mit“…
Das nur so am Rande.

Schönen Abend noch,
David

Danke Andreas.
Portugiesisch ist korrekt

Olá,
nochmal ich.
Diesmal mit einer rein technischen Frage:
Ich habe meinen Befehl mal ein bisschen erweitert, nachdem ich rausgefunden habe, dass sich mein gesuchter Wert nicht immer in der Charakteristik-id 435, sondern manchmal auch in 111, 192 oder 239 versteckt. Jetzt wollte ich noch alle Werte raushauen, deren Valor = 210 ist. Das hab ich folgendermaßen veranstaltet:

SELECT idproduto,valor FROM comprodutoscaracteristicasatribuicoes WHERE idproduto in (SELECT idproduto FROM comprodutos WHERE idprodutosubtipo = 2) and (idcaracteristica = 435 or idcaracteristica = 111 or idcaracteristica = 192 or idcaracteristica = 230) and valor120

Problem: Es werden keine Werte mehr angezeigt. Wenn ich nur nach volor>120 oder valor

Hi David,
das weiss ich.
Weil Valor nicht > 120 UND

Hallo David,

WHERE … valor120

Problem: Es werden keine Werte mehr angezeigt.

das ist kein Wunder: Du möchtest Zeilen haben, deren valor-Wert sowohl kleiner als auch größer 120 ist. Das ist aber unmöglich.

Andreas