SQL: Problem mit Sortierung (Group, Distinct, Subselect)

resterampe

Mitglied
Hallo zusammen,

ich habe 3 Tabellen die über LEFT Joins mit einander verknüpft sind.
Diese Abfrage und liefert mir alle möglichen Ergebnisse zurück.

Zur Struktur:
SQL:
-- phpMyAdmin SQL Dump
-- version 2.11.7
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Erstellungszeit: 15. Januar 2009 um 11:22
-- Server Version: 5.0.51
-- PHP-Version: 5.2.6

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

--
-- Datenbank: `parameter`
--

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `parameterwerte`
--

CREATE TABLE IF NOT EXISTS `parameterwerte` (
  `ID_Werte` int(10) NOT NULL auto_increment,
  `TimeStamp` timestamp NOT NULL default CURRENT_TIMESTAMP,
  `FID_User` int(10) NOT NULL,
  `Bemerkung` text NOT NULL,
  `W_001` text COMMENT 'Sollwert',
  `W_001min` text COMMENT 'Minimalwert',
  `W_001max` text COMMENT 'Maximalwert',
  `W_002` text COMMENT 'Sollwert',
  `W_002min` text COMMENT 'Minimalwert',
  `W_002max` text COMMENT 'Maximalwert',
  `W_003` text COMMENT 'Sollwert',
  `W_003min` text COMMENT 'Minimalwert',
  `W_003max` text COMMENT 'Maximalwert',
  `W_004` text COMMENT 'Sollwert',
  `W_004min` text COMMENT 'Minimalwert',
  `W_004max` text COMMENT 'Maximalwert',
  `W_005` text COMMENT 'Sollwert',
  `W_005min` text COMMENT 'Minimalwert',
  `W_005max` text COMMENT 'Maximalwert',
  `W_006` text COMMENT 'Sollwert',
  `W_006min` text COMMENT 'Minimalwert',
  `W_006max` text COMMENT 'Maximalwert',
  `W_007` text COMMENT 'Sollwert',
  `W_007min` text COMMENT 'Minimalwert',
  `W_007max` text COMMENT 'Maximalwert',
  `W_008` text COMMENT 'Sollwert',
  `W_008min` text COMMENT 'Minimalwert',
  `W_008max` text COMMENT 'Maximalwert',
  `W_009` text COMMENT 'Sollwert',
  `W_009min` text COMMENT 'Minimalwert',
  `W_009max` text COMMENT 'Maximalwert',
  `W_010` text COMMENT 'Sollwert',
  `W_010min` text COMMENT 'Minimalwert',
  `W_010max` text COMMENT 'Maximalwert',
  `W_011` text COMMENT 'Sollwert',
  `W_011min` text COMMENT 'Minimalwert',
  `W_011max` text COMMENT 'Maximalwert',
  `W_012` text COMMENT 'Sollwert',
  `W_012min` text COMMENT 'Minimalwert',
  `W_012max` text COMMENT 'Maximalwert',
  `W_013` text COMMENT 'Sollwert',
  `W_013min` text COMMENT 'Minimalwert',
  `W_013max` text COMMENT 'Maximalwert',
  `W_014` text COMMENT 'Sollwert',
  `W_014min` text COMMENT 'Minimalwert',
  `W_014max` text COMMENT 'Maximalwert',
  `W_015` text COMMENT 'Sollwert',
  `W_015min` text COMMENT 'Minimalwert',
  `W_015max` text COMMENT 'Maximalwert',
  `W_016` text COMMENT 'Sollwert',
  `W_016min` text COMMENT 'Minimalwert',
  `W_016max` text COMMENT 'Maximalwert',
  `W_017` text COMMENT 'Sollwert',
  `W_017min` text COMMENT 'Minimalwert',
  `W_017max` text COMMENT 'Maximalwert',
  `W_018` text COMMENT 'Sollwert',
  `W_018min` text COMMENT 'Minimalwert',
  `W_018max` text COMMENT 'Maximalwert',
  `W_019` text COMMENT 'Sollwert',
  `W_019min` text COMMENT 'Minimalwert',
  `W_019max` text COMMENT 'Maximalwert',
  `W_020` text COMMENT 'Sollwert',
  `W_020min` text COMMENT 'Minimalwert',
  `W_020max` text COMMENT 'Maximalwert',
  `W_021` text COMMENT 'Sollwert',
  `W_021min` text COMMENT 'Minimalwert',
  `W_021max` text COMMENT 'Maximalwert',
  `W_022` text COMMENT 'Sollwert',
  `W_022min` text COMMENT 'Minimalwert',
  `W_022max` text COMMENT 'Maximalwert',
  `W_023` text COMMENT 'Sollwert',
  `W_023min` text COMMENT 'Minimalwert',
  `W_023max` text COMMENT 'Maximalwert',
  `W_024` text COMMENT 'Sollwert',
  `W_024min` text COMMENT 'Minimalwert',
  `W_024max` text COMMENT 'Maximalwert',
  `W_025` text COMMENT 'Sollwert',
  `W_025min` text COMMENT 'Minimalwert',
  `W_025max` text COMMENT 'Maximalwert',
  `W_026` text COMMENT 'Sollwert',
  `W_026min` text COMMENT 'Minimalwert',
  `W_026max` text COMMENT 'Maximalwert',
  `W_027` text COMMENT 'Sollwert',
  `W_027min` text COMMENT 'Minimalwert',
  `W_027max` text COMMENT 'Maximalwert',
  `W_028` text COMMENT 'Sollwert',
  `W_028min` text COMMENT 'Minimalwert',
  `W_028max` text COMMENT 'Maximalwert',
  `W_029` text COMMENT 'Sollwert',
  `W_029min` text COMMENT 'Minimalwert',
  `W_029max` text COMMENT 'Maximalwert',
  `W_030` text COMMENT 'Sollwert',
  `W_030min` text COMMENT 'Minimalwert',
  `W_030max` text COMMENT 'Maximalwert',
  `W_031` text COMMENT 'Sollwert',
  `W_031min` text COMMENT 'Minimalwert',
  `W_031max` text COMMENT 'Maximalwert',
  `W_032` text COMMENT 'Sollwert',
  `W_032min` text COMMENT 'Minimalwert',
  `W_032max` text COMMENT 'Maximalwert',
  `W_033` text COMMENT 'Sollwert',
  `W_033min` text COMMENT 'Minimalwert',
  `W_033max` text COMMENT 'Maximalwert',
  `W_034` text COMMENT 'Sollwert',
  `W_034min` text COMMENT 'Minimalwert',
  `W_034max` text COMMENT 'Maximalwert',
  `W_035` text COMMENT 'Sollwert',
  `W_035min` text COMMENT 'Minimalwert',
  `W_035max` text COMMENT 'Maximalwert',
  `W_036` text COMMENT 'Sollwert',
  `W_036min` text COMMENT 'Minimalwert',
  `W_036max` text COMMENT 'Maximalwert',
  `W_037` text COMMENT 'Sollwert',
  `W_037min` text COMMENT 'Minimalwert',
  `W_037max` text COMMENT 'Maximalwert',
  `W_038` text COMMENT 'Sollwert',
  `W_038min` text COMMENT 'Minimalwert',
  `W_038max` text COMMENT 'Maximalwert',
  `W_039` text COMMENT 'Sollwert',
  `W_039min` text COMMENT 'Minimalwert',
  `W_039max` text COMMENT 'Maximalwert',
  `W_040` text COMMENT 'Sollwert',
  `W_040min` text COMMENT 'Minimalwert',
  `W_040max` text COMMENT 'Maximalwert',
  `W_041` text COMMENT 'Sollwert',
  `W_041min` text COMMENT 'Minimalwert',
  `W_041max` text COMMENT 'Maximalwert',
  `W_042` text COMMENT 'Sollwert',
  `W_042min` text COMMENT 'Minimalwert',
  `W_042max` text COMMENT 'Maximalwert',
  `W_043` text COMMENT 'Sollwert',
  `W_043min` text COMMENT 'Minimalwert',
  `W_043max` text COMMENT 'Maximalwert',
  `W_044` text COMMENT 'Sollwert',
  `W_044min` text COMMENT 'Minimalwert',
  `W_044max` text COMMENT 'Maximalwert',
  `W_045` text COMMENT 'Sollwert',
  `W_045min` text COMMENT 'Minimalwert',
  `W_045max` text COMMENT 'Maximalwert',
  `W_046` text COMMENT 'Sollwert',
  `W_046min` text COMMENT 'Minimalwert',
  `W_046max` text COMMENT 'Maximalwert',
  `W_047` text COMMENT 'Sollwert',
  `W_047min` text COMMENT 'Minimalwert',
  `W_047max` text COMMENT 'Maximalwert',
  `W_048` text COMMENT 'Sollwert',
  `W_048min` text COMMENT 'Minimalwert',
  `W_048max` text COMMENT 'Maximalwert',
  `W_049` text COMMENT 'Sollwert',
  `W_049min` text COMMENT 'Minimalwert',
  `W_049max` text COMMENT 'Maximalwert',
  `W_050` text,
  `W_050min` text,
  `W_050max` text,
  `W_051` text,
  `W_051min` text,
  `W_051max` text,
  `W_052` text,
  `W_052min` text,
  `W_052max` text,
  `W_053` text,
  `W_053min` text,
  `W_053max` text,
  `W_054` text,
  `W_054min` text,
  `W_054max` text,
  `W_055` text,
  `W_055min` text,
  `W_055max` text,
  `W_056` text,
  `W_056min` text,
  `W_056max` text,
  `W_057` text,
  `W_057min` text,
  `W_057max` text,
  `W_058` text,
  `W_058min` text,
  `W_058max` text,
  `W_059` text,
  `W_059min` text,
  `W_059max` text,
  `W_060` text,
  `W_060min` text,
  `W_060max` text,
  `W_061` text,
  `W_061min` text,
  `W_061max` text,
  `W_062` text,
  `W_062min` text,
  `W_062max` text,
  `W_063` text,
  `W_063min` text,
  `W_063max` text,
  `W_064` text,
  `W_064min` text,
  `W_064max` text,
  `W_065` text,
  `W_065min` text,
  `W_065max` text,
  `W_066` text,
  `W_066min` text,
  `W_066max` text,
  `W_067` text,
  `W_067min` text,
  `W_067max` text,
  `W_068` text,
  `W_068min` text,
  `W_068max` text,
  `W_069` text,
  `W_069min` text,
  `W_069max` text,
  `W_070` text,
  `W_070min` text,
  `W_070max` text,
  `W_071` text,
  `W_071min` text,
  `W_071max` text,
  `W_072` text,
  `W_072min` text,
  `W_072max` text,
  `W_073` text,
  `W_073min` text,
  `W_073max` text,
  `W_074` text,
  `W_074min` text,
  `W_074max` text,
  `W_075` text,
  `W_075min` text,
  `W_075max` text,
  `W_076` text,
  `W_076min` text,
  `W_076max` text,
  `W_077` text,
  `W_077min` text,
  `W_077max` text,
  `W_078` text,
  `W_078min` text,
  `W_078max` text,
  `W_079` text,
  `W_079min` text,
  `W_079max` text,
  `W_080` text,
  `W_080min` text,
  `W_080max` text,
  `W_081` text,
  `W_081min` text,
  `W_081max` text,
  `W_082` text,
  `W_082min` text,
  `W_082max` text,
  `W_083` text,
  `W_083min` text,
  `W_083max` text,
  `W_084` text,
  `W_084min` text,
  `W_084max` text,
  `W_085` text,
  `W_085min` text,
  `W_085max` text,
  `W_086` text,
  `W_086min` text,
  `W_086max` text,
  `W_087` text,
  `W_087min` text,
  `W_087max` text,
  `W_088` text,
  `W_088min` text,
  `W_088max` text,
  `W_089` text,
  `W_089min` text,
  `W_089max` text,
  `W_090` text,
  `W_090min` text,
  `W_090max` text,
  `W_091` text,
  `W_091min` text,
  `W_091max` text,
  `W_092` text,
  `W_092min` text,
  `W_092max` text,
  `W_093` text,
  `W_093min` text,
  `W_093max` text,
  `W_094` text,
  `W_094min` text,
  `W_094max` text,
  `W_095` text,
  `W_095min` text,
  `W_095max` text,
  `W_096` text,
  `W_096min` text,
  `W_096max` text,
  `W_097` text,
  `W_097min` text,
  `W_097max` text,
  `W_098` text,
  `W_098min` text,
  `W_098max` text,
  `W_099` text,
  `W_099min` text,
  `W_099max` text,
  `W_100` text,
  `W_100min` text,
  `W_100max` text,
  PRIMARY KEY  (`ID_Werte`),
  KEY `TimeStamp` (`TimeStamp`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2106 ;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `produkte`
--

CREATE TABLE IF NOT EXISTS `produkte` (
  `ID_Produkte` int(10) NOT NULL auto_increment,
  `Produktname` varchar(255) NOT NULL,
  `Produktnummer` int(7) NOT NULL,
  `Sollgewicht` int(10) default NULL COMMENT 'in Gramm',
  PRIMARY KEY  (`ID_Produkte`),
  UNIQUE KEY `Produktnummer` (`Produktnummer`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COMMENT='Auflistung aller Produkte' AUTO_INCREMENT=76 ;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `produkte_maschinen_parameterwerte`
--

CREATE TABLE IF NOT EXISTS `produkte_maschinen_parameterwerte` (
  `ID_P-M-PW` int(10) NOT NULL auto_increment,
  `FID_Produkte` int(10) NOT NULL,
  `FID_Maschinen` int(10) NOT NULL,
  `FID_Parameterwerte` int(10) NOT NULL,
  PRIMARY KEY  (`ID_P-M-PW`),
  KEY `FID_Produkte` (`FID_Produkte`),
  KEY `FID_Maschinen` (`FID_Maschinen`),
  KEY `FID_Parameterwerte` (`FID_Parameterwerte`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COMMENT='Ordnet Parameterwerte über Maschinen Produkten zu' AUTO_INCREMENT=2124 ;

Die oben erwähnte Abfrage ist folgende:
Er soll als VIEW angelegt werden (was auch nicht das Problem ist)
SQL:
SELECT `pmp`.`FID_Maschinen`, `pmp`.`FID_Produkte`, `p`.`Produktnummer`, `pw`.`TimeStamp`, `pw`.`W_001min`, `pw`.`W_001max`, `pw`.`W_002min`, `pw`.`W_002max`, `pw`.`W_003min`, `pw`.`W_003max`, `pw`.`W_004min`, `pw`.`W_004max`, `pw`.`W_005min`, `pw`.`W_005max`, `pw`.`W_006min`, `pw`.`W_006max`, `pw`.`W_007min`, `pw`.`W_007max`, `pw`.`W_008min`, `pw`.`W_008max`, `pw`.`W_009min`, `pw`.`W_009max`, `pw`.`W_010min`, `pw`.`W_010max`, `pw`.`W_011min`, `pw`.`W_011max`, `pw`.`W_012min`, `pw`.`W_012max`, `pw`.`W_013min`, `pw`.`W_013max`, `pw`.`W_014min`, `pw`.`W_014max`, `pw`.`W_015min`, `pw`.`W_015max`, `pw`.`W_016min`, `pw`.`W_016max`, `pw`.`W_017min`, `pw`.`W_017max`, `pw`.`W_018min`, `pw`.`W_018max`, `pw`.`W_019min`, `pw`.`W_019max`, `pw`.`W_020min`, `pw`.`W_020max`, `pw`.`W_021min`, `pw`.`W_021max`, `pw`.`W_022min`, `pw`.`W_022max`, `pw`.`W_023min`, `pw`.`W_023max`, `pw`.`W_024min`, `pw`.`W_024max`, `pw`.`W_025min`, `pw`.`W_025max`, `pw`.`W_026min`, `pw`.`W_026max`, `pw`.`W_027min`, `pw`.`W_027max`, `pw`.`W_028min`, `pw`.`W_028max`, `pw`.`W_029min`, `pw`.`W_029max`, `pw`.`W_030min`, `pw`.`W_030max`, `pw`.`W_031min`, `pw`.`W_031max`, `pw`.`W_032min`, `pw`.`W_032max`, `pw`.`W_033min`, `pw`.`W_033max`, `pw`.`W_034min`, `pw`.`W_034max`, `pw`.`W_035min`, `pw`.`W_035max`, `pw`.`W_036min`, `pw`.`W_036max`, `pw`.`W_037min`, `pw`.`W_037max`, `pw`.`W_038min`, `pw`.`W_038max`, `pw`.`W_039min`, `pw`.`W_039max`, `pw`.`W_040min`, `pw`.`W_040max`
FROM `produkte_maschinen_parameterwerte` AS `pmp`
LEFT JOIN `produkte` AS `p` ON (`p`.`ID_Produkte` = `pmp`.`FID_Produkte`)
LEFT JOIN `parameterwerte` AS `pw` ON (`pmp`.`FID_Parameterwerte` = `pw`.`ID_Werte`)
ORDER BY `pmp`.`FID_Maschinen` ASC, `p`.`Produktnummer` ASC, `pw`.`TimeStamp` DESC

Nun möchte ich aber für jede Kombination von `pmp`.`FID_Maschinen` und `pmp`.`FID_Produkte` nur den jüngsten Wert von `pw`.`TimeStamp` als Ergebnis bekommen.
Meine bisherigen Versuche mit GROUP BY mit und ohne HAVING, DISTINCT und subselects schlugen jedoch alle fehl.

Ich bin für jeden Denkanstoß dankbar.

Gruß
Julian
 
Zuletzt bearbeitet von einem Moderator:
Ich glaube ich verstehe das Problem falsch.. so einfach kann es eigentlich nicht sein.
Dennoch.. kannst du nicht per MIN(timestamp) das Ganze versuchen?
 
Hallo TS-JC,

Danke für Deine Antwort.

Ja, kann ich. Aber dann sollte ich das per MAX(TimeStamp) versuchen, dass gibt mir dann auch den jüngsten (neusten = größsten) Timestamp zurück.

Das Problem dabei ist dann, dass ich nur ein Ergebnis bekomme und nicht ein Ergebnis für jede Kombination von `pmp`.`FID_Maschinen` und `pmp`.`FID_Produkte`

Hatte ganz vergessen zu erwähnen, dass ich auch hiermit schon experimentiert habe.
 
Guten Morgen,

ich habe jetzt eine Lösung!

Ich löse das ganze jetzt mit Hilfe von drei VIEWS

1.) ich suche mir alle möglichen Daten und bringe Sie in einem VIEW zusammen
2.) ich suche mir alle möglichen Kombinationen von Maschine, Produkt mit dem jeweils maximalen TimeStamp und geben es als VIEW aus
3.) ich verknüpfe 2.) per LEFT JOIN mit 3.) und gebe es als VIEW aus

Die Frage ist nur wie bekomme ich das kompakter hin ohne die temporären VIEWS?

Hier der Code:
1.) temp_parameterwerte
siehe oben

2.) temp2_ parameterwerte
SQL:
SELECT `pmp`.`FID_Maschinen` , `p`.`Produktnummer` , max(`pw`.`TimeStamp`) AS `maxTimeStamp`
FROM `produkte_maschinen_parameterwerte` AS `pmp`
LEFT JOIN `parameterwerte` AS `pw` ON (`pmp`.`FID_Parameterwerte` = `pw`.`ID_Werte`)
LEFT JOIN `produkte` AS `p` ON (`p`.`ID_Produkte` = `pmp`.`FID_Produkte`)
GROUP BY `pmp`.`FID_Maschinen`, `p`.`Produktnummer`
ORDER BY `pmp`.`FID_Maschinen`, `p`.`Produktnummer`

3. ) parameterwerte
SQL:
SELECT `t`.* FROM `temp2_parametervergleich` AS `t2`
LEFT JOIN temp_parametervergleich AS `t` ON (`t`.`TimeStamp` = `t2`.`maxTimeStamp`)
 
Zuletzt bearbeitet von einem Moderator:
Puh also zumindest kannst du deinen 2. View verkürzen.
Da reicht ja die Tabelle pmp eigentlich.
Dann würd ich den 3. ganz weglassen und statt der Tabelle pmp im 1. View den 2. View einsetzen.

Das hörte sich grad in meinem Kopf richtig an... versuch es mal.

SQL:
View 1:
SELECT (alles andere) , max(TimeStamp) AS maxTimeStamp
FROM produkte_maschinen_parameterwerte
GROUP BY FID_Maschinen, FID_Parameterwerte

View 2:
SELECT `pmp`.`FID_Maschinen`, `pmp`.`FID_Produkte`, `p`.`Produktnummer`, `pw`.`TimeStamp`, `pw`.`W_001min`, `pw`.`W_001max`, `pw`.`W_002min`, `pw`.`W_002max`, `pw`.`W_003min`, `pw`.`W_003max`, `pw`.`W_004min`, `pw`.`W_004max`, `pw`.`W_005min`, `pw`.`W_005max`, `pw`.`W_006min`, `pw`.`W_006max`, `pw`.`W_007min`, `pw`.`W_007max`, `pw`.`W_008min`, `pw`.`W_008max`, `pw`.`W_009min`, `pw`.`W_009max`, `pw`.`W_010min`, `pw`.`W_010max`, `pw`.`W_011min`, `pw`.`W_011max`, `pw`.`W_012min`, `pw`.`W_012max`, `pw`.`W_013min`, `pw`.`W_013max`, `pw`.`W_014min`, `pw`.`W_014max`, `pw`.`W_015min`, `pw`.`W_015max`, `pw`.`W_016min`, `pw`.`W_016max`, `pw`.`W_017min`, `pw`.`W_017max`, `pw`.`W_018min`, `pw`.`W_018max`, `pw`.`W_019min`, `pw`.`W_019max`, `pw`.`W_020min`, `pw`.`W_020max`, `pw`.`W_021min`, `pw`.`W_021max`, `pw`.`W_022min`, `pw`.`W_022max`, `pw`.`W_023min`, `pw`.`W_023max`, `pw`.`W_024min`, `pw`.`W_024max`, `pw`.`W_025min`, `pw`.`W_025max`, `pw`.`W_026min`, `pw`.`W_026max`, `pw`.`W_027min`, `pw`.`W_027max`, `pw`.`W_028min`, `pw`.`W_028max`, `pw`.`W_029min`, `pw`.`W_029max`, `pw`.`W_030min`, `pw`.`W_030max`, `pw`.`W_031min`, `pw`.`W_031max`, `pw`.`W_032min`, `pw`.`W_032max`, `pw`.`W_033min`, `pw`.`W_033max`, `pw`.`W_034min`, `pw`.`W_034max`, `pw`.`W_035min`, `pw`.`W_035max`, `pw`.`W_036min`, `pw`.`W_036max`, `pw`.`W_037min`, `pw`.`W_037max`, `pw`.`W_038min`, `pw`.`W_038max`, `pw`.`W_039min`, `pw`.`W_039max`, `pw`.`W_040min`, `pw`.`W_040max`
FROM View1 AS `pmp`
LEFT JOIN `produkte` AS `p` ON (`p`.`ID_Produkte` = `pmp`.`FID_Produkte`)
LEFT JOIN `parameterwerte` AS `pw` ON (`pmp`.`FID_Parameterwerte` = `pw`.`ID_Werte`)
ORDER BY `pmp`.`FID_Maschinen` ASC, `p`.`Produktnummer` ASC, `pw`.`TimeStamp` DESC
 
Ich glaube ich verstehe was Du meinst.

Allerdings kann ich in Deinem VIEW 1 keinen TimeStamp abfragen, da dieser in Parameterwerte (pw) ist und nicht in P...... (pmp)
Sprich da bliebe mir der JOIN nicht erspart und ich wäre wieder bei meinem VIEW 2 nur dass ich die Produktnummer nicht habe sondern nur die Produkt-ID

Deinen 2. VIEW müsste dann noch ergänzt werden, beziehungsweise der Join müsste mit `pmp`.`maxTimeStamp` = `pw`.`TimeStamp` verknüpft werden.

Dann hätte man zumindes 1 Abfrage gespart - ich teste und werde berichten

Danke
 
Hat hervorragend geklappt.

Vielen Dank.

Als Fazit kann ich mir ziehen:
Versuche nicht immer alles in einem Schritt - in zwei geht es manchmal viel einfacher :)
 
Zurück