SQL Nur größten Wert einer bestimmten Auswahl ausgeben

raffiSSL

Lt. Junior Grade
Dabei seit
Feb. 2006
Beiträge
284
Hallo,
ich habe eine Problem beim Auslesen von Datensätzen aus einer Tabelle, aufgrund einer Versionierung. Ganz konkret geht es darum, dass ich nur die aktuellste Version mehrerer Datensätze haben will. Diese aktuellste Version bestimmt sich durch eine vid (integer-Wert). Zu Überprüfen wären nun alle Zeilen mit einer gleichen nid (integer-Wert). Ausgabe soll eben dann die Kombi aus nid und zueghöriger größter vid sein.
Tabellenaufbau:
nid | vid | field_firmenid_value
22 | 5 | 12344
23 | 7 | 12345
23 | 8 | 12345
24 | 10 | 12347
24 | 11 | 12347
23 | 12 | 12345
26 | 14 | 12340

Am Tabellenschema kann ich nichts ändern, da ich die Daten aus einer Drupal-DB auslesen möchte. Derzeit versuche ich den Umweg über PHP und eine mehrdimensionales Array, bin dort aber noch nicht wirklich voran gekommen.
Der erste Weg wäre natürlich MySQL, dort habe ich aber garkeinen Ansatz. Bei Verwendung von distinct wäre meine Frage, ob auch die aktuellste Version angezeigt wird, aber sicherlich nicht oder? Hatte mal beim Suchen im Internet was mit Inner Join entdeckt, könnte das funktionieren innerhalb einer Tabelle?

Danke
 

trialgod

Lt. Commander
Dabei seit
Feb. 2008
Beiträge
1.388
verusch mal

Code:
SELECT *
FROM ...
WHERE MAX(vid)
Kann es gerade nicht testen, könnte aber funzen.
 

simon04

Ensign
Dabei seit
Mai 2004
Beiträge
137
Code:
select * from [tabelle] [where ...] order by vid desc limit 1
Diese Abfrage sortiert die Tabelle absteigend nach vid und gibt nur den ersten Eintrag (also mit der höchsten vid) aus. [tabelle] und ggf. [where ...] sind entsprechend anzupassen.
 

mugam

Fleet Admiral
Dabei seit
Feb. 2006
Beiträge
11.075
select nid,max(vid)
from ...
group by nid;

gibt jede nid und die zugehörige höchste vid aus.
 
Zuletzt bearbeitet:

cheft

Lt. Junior Grade
Dabei seit
Dez. 2004
Beiträge
290
Habe leider auch keine Testmöglichkeit und nur den SQL Syntax (MS) im Kopf, dort würde es dann so aussehen. Ob es sich nach MySQL umformen lässt weiß ich leider nicht.

Code:
Select * from <table> where vid = (Select max(vid) from <table>);
Leider weiß ich gerade nicht, ob MySQL Subqueries unterstützt.

Ansonsten mach 2 Abfragen in PHP,

1. Select max(vid) as maxVid from <table>;
maxVid in Variable <phpVar> speichern
2. Select * from <table> where vid = <phpVar>;

EDIT: Subqueries sollten funktionieren: http://dev.mysql.com/doc/refman/5.0/en/subqueries.html
 
Zuletzt bearbeitet:

FrankR

Cadet 3rd Year
Dabei seit
Mai 2011
Beiträge
33
Code:
select a.*
from [Tabelle]        a
join  (select nid, max(vid) as maximum 
       from [Tabelle] 
       group by nid)  b on b.nid = a.nid and b.maximum = a.vid
Frank
 

raffiSSL

Lt. Junior Grade
Ersteller dieses Themas
Dabei seit
Feb. 2006
Beiträge
284
Hui,
das ging ja schnell. Und ich habs mir fast gedacht, es ist doch einfacher als vermutet. Die Lösung von mugam funkioniert bestens. Einen Haken hat die Lösung aber noch:
Ich greife auf die Abfrage folgendermaßen zu:
PHP:
$read_company_id = mysql_query("SELECT field_firmenid_value, nid, MAX(vid) FROM content_type_firma GROUP BY nid", $drupal_db_link);
	
	while ($company_ids = mysql_fetch_array($read_company_id)) {
		echo "<p>".$company_ids["field_firmenid_value"]." + vid ".$company_ids["vid"]."</p>";
	}
Leider gibt er mir mit dem Hinweis Undefined index: vid in C:\xxx\xxx\xxx.php on line 52 keine vid mit aus. Das bräuchte ich jetzt nur um sicher zu gehen, dass die Lösung auch wasserdicht ist, obwohl sie es zu sein scheint.
Die Lösungen von simon04 und trialgod führen leider nur zur Ausgabe des Datensatzes mit der höchsten vid, zumindest auf den ersten Blick.
Die beiden anderen Abfragen von cheft und FrankR würde ich erst ausprobieren, wenn die oben genannte Lösung doch noch irgendwelche Haken hat. :)
Trotzdem schonmal danke für die schnelle Hilfe.

MfG

EDIT: OK habs. Komplette Abfrage sieht nun so aus:
Code:
SELECT field_firmenid_value, nid, MAX(vid), vid FROM content_type_firma GROUP BY nid
EDIT 2:
Also nachdem ich jetzt die vid sehen konnte, musste ich feststellen, dass er mir jeweils die erste ausgibt, und somit bei mehreren Versionen die älteste. Problem ist also doch nicht gelöst.
 
Zuletzt bearbeitet:

FrankR

Cadet 3rd Year
Dabei seit
Mai 2011
Beiträge
33
Bei deiner Abfrage
Code:
SELECT field_firmenid_value, nid, MAX(vid) FROM content_type_firma GROUP BY nid
gibt es zwei Auffälligkeiten. Zum einen gruppierst du nur über nid und nicht auch noch über field_firmenid_value und zum andern hast du keine Spalte mit vid benannt, obwohl du später via
Code:
$company_ids["vid"]
darauf zugreifst.
Eventuell hilft bereits ein einfaches as vid
Code:
SELECT field_firmenid_value, nid, MAX(vid) as vid FROM content_type_firma GROUP BY nid
Frank
 

raffiSSL

Lt. Junior Grade
Ersteller dieses Themas
Dabei seit
Feb. 2006
Beiträge
284
Also ich hatte inzwischen die Lösung von FrankR probiert, diese funktioniert tadellos. Nachdem ich auch das as vid ergänzt hatte in der Abfrage von mugam, funktioniert auch diese wie gewollt.

Also nochmals vielen Dank, hätte ich gewusst dass es so einfach ist...

MfG
 

cheft

Lt. Junior Grade
Dabei seit
Dez. 2004
Beiträge
290
Hmm, vergiss mal meine Lösung, ich habe deinen Text mit der gewünschten Ausgabe falsch verstanden.

Bei meiner Lösung bekommst du nur die Datensätze der aktuellsten Version zurück, aber keine Datensätze mit einer NID keinen! Eintrag mit der aktuellsten VID besitzen -> Somit ein unvollständiges Ergebnis.
 
Top