gs-500.de

gs-500.de (https://forum.gs-500.de/index.php)
-   Computer, Handy, Technik, ... (https://forum.gs-500.de/forumdisplay.php?f=23)
-   -   SQL - Frage (https://forum.gs-500.de/showthread.php?t=11852)

Sumpfmensch 01.06.2007 11:29:04

SQL - Frage
 
Hey Leute,
da ich gelesen hab, dass ja auch ein paar weitere Informatiker unter euch weilen stell ich einfach mal ne Frage nach ner Query, die ich mit meiner bisherigen ERfahrung leider noch nicht erstellen kann :(

Aaaalso ...
ich habe folgende Tabelle:
Code:

----------------------------------------
|  id  |  name  | gueltig_ab  | preis |
----------------------------------------
|  1  |    nr 1  | 01.01.07  |    10  |
----------------------------------------
|  2  |    nr 2  | 02.01.07  |    12  |
----------------------------------------
|  3  |    nr 3  | 01.01.07  |    10  |
----------------------------------------
|  4  |    nr 1  | 23.04.07  |    20  |
----------------------------------------

Das Problem ist jetzt, dass ich nur die aktuellen preise für die produkte (unter name) haben möchte

name ist jetzt in dem beispiel eindeutig (in wirklichkeit ist das ein primärschlüssel einer anderen tabelle, tut hier ja aber nichts zur sache)

ich hab schon ne lösung mit einer oder zwei (weiß ich grad nicht) inneren abfragen, aber die ist extrem lang und umständlich, aber es muss ja irgendwie besser gehen.

ich denke, dass ich nicht drauf komme, liegt an meiner fehlenden erfahrung bezüglich group by und den aggregatfunktionen

und jetzt leute, haut rein :wink:

ich hab jetzt schon stundenlang rumgegrübelt, mir fällt aber nix ein ...

danke schon mal

jussen 01.06.2007 12:22:00

hmm ... musst nen bisl probiern aber ich geb ma hier nen paar denkanstöße wies funktionieren könnte.
Evtl. unterstützt date die max funktion. Einfach wäre beispielsweise

Code:

SELECT * FROM Tabelle
WHERE name = (SELECT name FROM Tabelle WHERE gueltig_ab =
(SELECT MAX(gueltig_ab) FROM Tabelle)


coolere lösung auf die schnelle wüsst ich auch nich. ich denke du wirst es nicht mit einem nicht-verschalteltem statement hinbekommen.

verdi 01.06.2007 13:48:20

@jussen: wenn du schon verschachtelst dann kannste auch einfach in der inneren nen order by datum DESC limit 0,1 machen ...

Sumpfmensch 01.06.2007 16:50:35

Zitat:

Zitat von jussen
hmm ... musst nen bisl probiern aber ich geb ma hier nen paar denkanstöße wies funktionieren könnte.
Evtl. unterstützt date die max funktion. Einfach wäre beispielsweise

Code:

SELECT * FROM Tabelle
WHERE name = (SELECT name FROM Tabelle WHERE gueltig_ab =
(SELECT MAX(gueltig_ab) FROM Tabelle)


coolere lösung auf die schnelle wüsst ich auch nich. ich denke du wirst es nicht mit einem nicht-verschalteltem statement hinbekommen.

Bei der Lösung kommt aber was ganz andres raus.
Du stellst als Bedingung, dass der name = dem namen ist, dessen gueltig ab genauso groß wie das größte gueltig ab der tabelle ist.
das heißt, du bekommst den ersten und den letzten datensatz zurück, da dort der name nr 1 ist, welcher an der vierten stelle den größten wert bei gueltig ab hat.

ich hab jetzt meine lösung mal auf die beispieltabelle übertragen und schon sieht sie gar nicht mehr sooooo kompliziert aus.

Code:

SELECT * FROM tbl_test as t1
WHERE gueltig_ab =
  (SELECT max(gueltig_ab)
  FROM tbl_test as t2
  WHERE t2.name = t1.name)

ein einfacher join ist ja ok ... mein prob ist nur, dass diese beispieltabelle (tbl_test) in wirklichkeit schon aus drei tabellen besteht!

und da das innere SELECT ja für jede spalte einzeln nochmal ausgeführt wird, wird das bei ca 2000 datensätzen in einer, 5000 in der zweiten und (nur) 10 in der dritten bei nem 6-fach-join schon relativ umfangreich :(

wenn jemand ne idee hat, wie ich das ohne dieseS (hier unproblematischen, in meinem fall aber relativ ungünstigen) innere SELECT lösen kann: her damit :wink:

Danke


EDIT: erm ... ist das order by und limit denn schneller als ein max (in meinem fall jetzt) ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:59:00 Uhr.

Powered by vBulletin® Version 3.8.9 (Deutsch)
Copyright ©2000 - 2026, vBulletin Solutions, Inc.