SQL - nur Daten mit niedrigster ID ausgeben

winscheil

Cadet 2nd Year
Registriert
Apr. 2017
Beiträge
17
Hallo, ich habe folgende Tabelle:

Projekt ID Notiz
12 1 abc
12 2 xyz
13 6 grt
13 8 lkt
15 3 dfg
15 4 rtz

Ich möchte immer nur die Notiz mit der niedrigsten ID von jedem Projekt ausgeben.
Also am Ende soll es so ausgegeben werden:
Projekt ID Notiz
12 1 abc
13 6 grt
15 3 dfg

Wie kann ich das machen?
Mit Top 1, distinct und min(id) hat es nicht funktioniert.
 
CREATE TABLE #xxx
(
Projekt INT,
ID INT,
Notiz VARCHAR(10)
);

INSERT INTO #xxx VALUES (12, 1, 'abc');
INSERT INTO #xxx VALUES (12, 2, 'xyz');
INSERT INTO #xxx VALUES (13, 6, 'grt');
INSERT INTO #xxx VALUES (13, 8, 'lkt');
INSERT INTO #xxx VALUES (15, 3, 'dfg');
INSERT INTO #xxx VALUES (15, 4, 'rtz');

SELECT *
FROM #xxx;

SELECT A.*
FROM #xxx AS A
INNER JOIN
(
SELECT
Projekt,
(MIN(ID)) AS "ID_min"
FROM #xxx
GROUP BY Projekt
) AS B ON (A.Projekt = B.Projekt) AND (A.ID = B.ID_min);
 
wenn ich jetzt folgendes SQL-Statement nehme:

select PROJEKT, ID, NOTIZ from TABELLE order by ID LIMIT 1

bekomme ich eine Fehlermeldung,: Falsche Syntax in der Nähe von LIMIT
Ergänzung ()

Group by kann ich nicht nehmen:
da ich ja auch die Notiz ausgebe und somit auch auf die groupieren muss und da jede Notiz unterschiedlich ist, werden alle Notizen ausgegeben.

select min(ID),PROJEKT, NOTIZ from TABELLE group by PROJEKT, NOTIZ
 
Hi,

Group by kann ich nicht nehmen:
da ich ja auch die Notiz ausgebe und somit auch auf die groupieren muss und da jede Notiz unterschiedlich ist, werden alle Notizen ausgegeben.

Käse

screen.JPG

VG,
Mad
 
select * from (select * from TABELLE order by ID) as TABELLE group by PROJEKT

Die ORDER BY-Klausel ist in Sichten, Inlinefunktionen, abgeleiteten Tabellen, Unterabfragen und allgemeinen Tabellenausdrücken nur dann gültig, wenn auch TOP, OFFSET oder FROM XML angegeben wird.
 
Hi,

und jetzt? Wo hast du bisher von "Sichten, Inlinefunktionen, abgeleiteten Tabellen, Unterabfragen und allgemeinen Tabellenausdrücken" gesprochen? Ich habe deine Tabelle nachgebaut und dir dein Ergebnis geliefert. Wenn du weitere Einschränkungen und Vorgaben hast dann schreib das auch dazu!

VG,
Mad
 
brj1172brj schrieb:
Code:
SELECT
  A.*
FROM TABLE AS A
INNER JOIN
(
  SELECT
    Projekt,
    (MIN(ID)) AS "ID_min"
  FROM TABLE
  GROUP BY Projekt
) AS B
ON (A.Projekt = B.Projekt) AND (A.ID = B.ID_min)

Das wäre auch meine Vorgehensweise, wobei die Joinbedingung
Code:
(A.Projekt = B.Projekt)
im falle einer Unique ID natürlich überflüssig wäre.
 
https://www.w3schools.com/sql/sql_func_min.asp

MIN Funktion bei der ID verwenden?

P.S.: Ich sollte aufmerksamer lesen, sehe das hast du schon getestet. Vermutlich gibt er dann nur die 1 aus,oder?

Eine Kombination aus Distinct aufs Projekt i.v.m. der MIN Funktion auf die ID geht auch nicht?
 
Zuletzt bearbeitet:
ich habe deinen Befehl bei mir eingeben und habe dann diese Fehlermeldung bekommen.
SELECT * FROM (SELECT * FROM 'test' ORDER BY 'id') as tabA group by 'projekt'

wenn ich jetzt das ORDER by weglasse und statt * PROJEKT hinschreibe, dann käme die richtige Auswahl.
SELECT PROJEKT FROM (SELECT * FROM 'test') as tabA group by 'projekt'

sobald ich aber * statt PROJEKT hinschreibe, bekomme ich wieder eine Fehlermeldung
SELECT PROJEKT, NOTIZ FROM (SELECT * FROM 'test') as tabA group by 'projekt'
Die tabA.NOTIZ-Spalte ist in der Auswahlliste ungültig, da sie nicht in einer Aggregatfunktion und nicht in der GROUP BY-Klausel enthalten ist.

und wenn ich dann auch nach der NOTIZ groupiere kommen wieder alle Zeilen.
Irgendwas mach ich falsch.
Ergänzung ()

mit dem SQL-Befehl von fexxianosch funktioniert es.
Vielen Dank!
 
Der Dank geht an brj1172brj, ich wäre nur genauso vorgegangen...
 
Hi,

ich habe deinen Befehl bei mir eingeben und habe dann diese Fehlermeldung bekommen.

dann solltest du vielleicht erst einmal dazu sagen, wo du das eingibst, wie die Datenstruktur darunter ist und was für ein System genutzt wird. Bei MySQL mit einer einfachen Tabelle nach deinen Vorgaben gibt es keinen Fehler mit meiner Abfrage - ich denke, der Screenshot aus phpMyAdmin spricht für sich...

VG,
Mad
 
Code:
select projekt, id(min) as id_min, notiz from tabelle
group by projekt
Sollte doch funktionieren
 
Zuletzt bearbeitet: (besserer Link)
Madman1209 schrieb:
Bei MySQL mit einer einfachen Tabelle nach deinen Vorgaben gibt es keinen Fehler mit meiner Abfrage - ich denke, der Screenshot aus phpMyAdmin spricht für sich...

Was aber nur am schrottigen MySQL liegt... in jedem vernünftigen Datenbanksystem liefert so eine Abfrage einen Fehler, da eben nicht klar angegeben ist welche Werte aus den nicht gruppierten Spalten selektiert werden sollen. Du verlässt dich bei deiner Abfrage darauf das MySQL automatisch den ersten nimmt.

Klar: der TE hätte besser mit angegeben welches DBMS er nutzt. Aber dann beim Antworten von einem Sonderfall auszugehen ist auch eher ungünstig.
 
Jesterfox schrieb:
Was aber nur am schrottigen MySQL liegt... in jedem vernünftigen Datenbanksystem liefert so eine Abfrage einen Fehler, da eben nicht klar angegeben ist welche Werte aus den nicht gruppierten Spalten selektiert werden sollen. Du verlässt dich bei deiner Abfrage darauf das MySQL automatisch den ersten nimmt.
Siehe meinen obigen Link, das ist konfigurierbar. Ich würde das aber auch nicht machen.
 
Hi,

Du verlässt dich bei deiner Abfrage darauf das MySQL automatisch den ersten nimmt.

kleine Korrektur: ich weiß, dass es so ist ;)

Klar: der TE hätte besser mit angegeben welches DBMS er nutzt. Aber dann beim Antworten von einem Sonderfall auszugehen ist auch eher ungünstig.

bei aller Liebe, aber MySQL ist kein Sonderfall... dass sich MySQL so verhält mag ein Sonderfall sein, aber in 99% der Fälle haben Leute, die in einem Forum (!) nach Hilfestellung bei einer relativ trivialen SQL Abfrage suchen keine großen Datenbanksysteme am laufen sondern eben was kleines kostenloses wie MySQL, zumindest sofern sie nicht explizit dazu schreiben, welches DBMS verwendet wird

VG,
Mad
 

Ähnliche Themen

Zurück
Oben