Problem mit verschachtelter Abfrage von 2 Tabellen

Hallo,

habe folgendes Problem bei meiner Abfrage und komme nicht weiter:

Ich habe eine Datenbank mit 2 Tabellen.
In der 1. Tabelle stehen Artikel:
Artikel
id Artikelnumer Bezeichnung
1 123456 Artikel 1
2 236456 Artikel 2
3 358756 Artikel 3
4 456879 Artikel 4

In der 2. Tabelle werden verschiede Artikelmerkmale hinterlegt mit Historie:
Status
id Artikelid Merkmal Wert Datum
1 1 1 100 2009-06-01
2 1 1 150 2009-06-20
3 1 1 120 2009-06-25
4 1 2 test 2009-06-10
5 1 2 betrieb 2009-06-11
6 2 3 8 2009-06-01
7 2 3 10 2009-06-20

Nun habe ich in php ein Eingabeformular, dass mir eine Auswahlliste aller Artikel anzeigt.
Wenn nun ein Artikel ausgewählt wurde, erscheinen zusätzliche Auswahlfelder (z.B. Mekmal 1, Merkmal 2,…) mit den jeweils möglichen Werten.
Also wähle ich z.B. Artikel 1, erscheinen zwei Auswahlfelder:
Merkmal 1 mit dem Inhalt: 100, 120, 150
Merkmal 2 mit dem Inhalt: test, betrieb

Wenn ich nun auswähle: Merkmal 1 -> 120 und Merkmal 2 -> Betrieb und anschließend auf Anzeigen klicke, soll eine Zeile mit dem Artikel anzeigen, welcher beide als aktuelle Merkmale hat.
Wenn ich im gegenzug Merkmal 1 -> 100 und Merkmal 2 -> Betrieb auswähle, sollte nichts angezeigt werden, da bei Merkmal 1 der Wert 100 nicht der aktuelle (letzte) Wert ist.

Ich hoffe, dass meine Frage einigermaßen verständlich ist und mir auch jemand helfen kann.

Vielen Dank im voraus.
Grüße.
Stefan

wenn ich du waere, wuerde ich zusehen, dass du das aktuell gueltige merkmal durch ein kennzeichen (zusaetzliches feld) explizit markierst … das macht die abfrage des gültigen merkmals wesentlich einfacher …

es geht aber auch ohne:

das aktuelle merkmal findest du in etwa so

select …
from merkmale
oder by datum desc
limit 1

was aber, wenn du mehrere merkmal-versionen mit dem gleichen datum hast - sowas kann sich an einem tag doch sicher mal aendern :slight_smile:

Hallo,

danke für die schnelle Antwort.

  1. Zum Datum: Hab hier die Tabelle vereinfacht. In wirklichkeit ist das Komplett mit Datum und Uhrzeit.

  2. Zur Abfrage: Das Problem ist ja, dass ich auch mehrere Merkmale für einen Artikel habe, da funktioniert das dann nicht.

  3. Dann bleibt noch das Problem mit der Suche. Wenn ich 2 Merkmale habe, werden mir auch immer 2 Zeilen Angezeigt und nicht nur eine.


    Grüße.
    Stefan

soll ich dir das kennzeichen befehlen? :slight_smile:

  1. Zur Abfrage: Das Problem ist ja, dass ich auch mehrere Merkmale für einen Artikel habe, da funktioniert das dann nicht.

das macht nichts - man darf auch mehrere subqueries in einer abfrage verwenden…

  1. Dann bleibt noch das Problem mit der Suche. Wenn ich 2 Merkmale habe, werden mir auch immer 2 Zeilen Angezeigt und nicht nur eine.

du willst ja artikel sehen … für die sowohl ein merkmal 1 und merkmal 2 existieren (evtl. mit gewuenschtem wert - den muesstest du in den jeweiligen subqueries ebenfalls einschränken)

also etwa so

SELECT ... FROM artikel a
WHERE a.id IN (SELECT id FROM merkmale 
                         WHERE merkmal = 1 AND wert = <?> ORDER BY datum DESC LIMIT 1)
   AND a.id IN (SELECT id FROM merkmale 
                    WHERE merkmal = 1 AND wert = <?> ORDER BY datum DESC LIMIT 1)

man koennte auch mit EXISTS und korrelation arbeiten …

die merkmale sind ja ansonsten unabhaengig voneinander

evtl. hilft dir ja diese technik weiter:

select * from status where (artikel_id,merkmal,datum) IN
(select artikel_id,merkmal,max(datum) from status group by artikel_id,merkmal)

würde die aktuellsten Merkmale jedes Artikels zurückgeben