[mysql] Maximal 3 gleiche aus einer Spalte

Sway

Erfahrenes Mitglied
Hi,
ich habe folgendes Problem, bei dem ich auf MySQL Seite nicht weiter komme. Ich habe eine Tabelle (siehe unten), in der ich auf einen Fremdschlüssel(punkt_id) verweise. Ich möchte die komplette Tabelle auslesen, allerdings dürfen maximal 3 gleiche punkt_id's vorkommen...


Wäre nett, wenn mir jemand einen Lösungsvorschlag machen könnte.

Code:
+----+---------------------+------------+----------+
| id | timestamp           | infoart_id | punkt_id |
+----+---------------------+------------+----------+
|  1 | 2005-08-10 10:00:48 | 2          |       40 |
|  2 | 2005-08-10 11:03:32 | 3          |       40 |
| 19 | 2005-08-16 09:36:41 | 3          |       29 |
| 20 | 2005-08-16 09:47:02 | 2          |       57 |
| 21 | 2005-08-16 09:51:37 | 1          |       40 |
| 22 | 2005-08-16 09:51:57 | 4          |       40 |
| 23 | 2005-08-16 09:52:57 | 3          |       40 |
| 24 | 2005-08-16 09:53:39 | 1          |       40 |
| 25 | 2005-08-16 09:54:04 | 4          |       40 |
| 26 | 2005-08-16 10:34:19 | 4          |       29 |
| 27 | 2005-08-16 10:34:43 | 1          |       29 |
+----+---------------------+------------+----------+


Gruß
Sven
 
Wenn ich die Aufgabe richtig verstanden habe, geht das nicht mit einer einzigen Abfrage (eventuell über Sub-Selects).

Du müsstest erstmal feststellen, welche punkt_id es überhaupt gibt (mit GROUP BY). Dann jeweils gleiche punkt_id abfragen. Wenn du nur die 3 neusten haben willst (bei gleichen punkt_id) solltest du ein ORDER BY timestamp DESC machen und mit LIMIT 3 auf die drei ersten Begrenzen.

Ich würde auch das Feld nicht "timestamp" nennen, weil das ein reserviertes Wort in MySQL ist. Das könnte zu Problemen führen.

Ich hoffe, dass ich deine Anforderung damit richtig verstanden habe. Ansonsten habe ich mal ein kleines Tutorial für ein ganz ähnliches Problem gemacht:

http://www.heddesheimer.de/coaching/mysql_group.html

Vielleicht hilft dir das ja weiter.

Gruß Marian
 
Ich habe gehofft, das es mit einer Abfrage geht. Schade, bisher habe ich es auf der Programmseite geregelt und hoffte etwas mehr Performance rausholen zu können... schade schade

Danke für den Hinweis mit dem "timestamp".
Da habe ich beim erstellen garnicht dran gedacht :)
 
Mit dem Umweg über eine temporäre Tabelle holst du immer noch deutlich mehr Perfomance heraus, als wenn du es über eine Schleife in PHP machst.

Ich hatte bei Kunden schon Abfragen von 10 Minuten auf 30 Sekunden optimiert, nur durch Benutzung von temporären Tabellen.

Gruß Marian
 
Ich habe aber doch noch folgendes Problem: Ich muss für jede ID eine extra Abfrage starten.

In meinem Fall finde ich die ID's 29, 40, 57. Diese muss ich zwischenspeichern und anschließend
für jede ID ein SELECT Statement mit "LIMIT 0,3" absetzen. Da MySQL meines Wissens nach kein
for oder while kennt, mache ich das von der Softwareseite (was viel Performance frisst).

Das ist genau das was ich gerade tue... vielleicht habe ich deine Antwort auch missverstanden :confused:


Gruß
Sven
 
Zuletzt bearbeitet:
Na ja, so geht es genau genommen.

Wenn Du allerdings sehr viele Einträge hast, ist es vielleicht sinnvoller, über eine Zwischen-Tabelle (temporäre Tabelle) einfach alle Einträge zu selektieren und bei der Ausgabe dann nur die ersten drei auszuwerten.

Das musst du allerdings am konkreten Beispiel mal probieren, was da schneller ist.

Du könntest sogar die Sache noch eingrenzen, indem du die Einträge, die mehr als 3 gleiche punkt_id haben, über eine Extra-Tabelle (temporär) abhandelst.

Konkret könnte ich mehr dazu sagen, dann müsste ich aber die Tabellen und die Daten haben.

Gruß Marian
 

Neue Beiträge

Zurück