Darstellung von Zeilen, wenn doppelte Daten und keine Rückbuchung

Blue Effect

Mitglied
Guten Morgen,

ich experimentiere gerade mit einem Beispiel, bei dem User virtuelle Konten haben.
Dazu gibt es Kontoauszüge (siehe Anhang 1). Ich möchte nun in einer Abfrage alle Auszüge anzeigen lassen, die doppelt vorkommen (heißt user,betrag,waehrung,art,details sind in min. 2 Zeilen gleich).
Das funktioniert auch wunderbar:
Code:
SELECT 
*, COUNT(*) AS anzahl 
FROM 
`user_konto_logs` 
GROUP BY user,betrag,waehrung,art,details,rueckbuchungID 
HAVING COUNT(*)>=2 AND art="wetten+" 
ORDER BY zeit DESC

Bei doppelten Zeilen kann ich eine neue Transaktion erzeugen, die (mit neuem Zeitstempel) eine Rückbuchung erzeugt (siehe letzte Zeile in der Abbildung). Der Betrag wird also wieder einmal abgezogen und in der Spalte rueckbuchungID wird die ID der Transaktion angezeigt, die rückgängig gemacht wurde.

Wie finde ich nun nur die doppelten Transaktionen, die noch keine Rückbuchung haben?
Ich habe mich an einer Abfrage versucht, allerdings scheint die zu aufwändig zu sein, MySQL braucht Minuten und beendet die Abfrage ohne Antwort.
Code:
SELECT 
*, COUNT(*) AS anzahl 
FROM `user_konto_logs` 
GROUP BY user,betrag,waehrung,art,details,rueckbuchungID 
HAVING 
COUNT(*)>=2 AND 
art="wetten+" AND 
id IN (SELECT rueckbuchungID FROM user_konto_logs WHERE rueckbuchungID>0) 
ORDER BY zeit DESC

Mit Joins habe ich nichts passendes finden können, die meisten Beispiele sind mit mehreren Tabellen.
Habt ihr eine Idee, mit welchem Grundsatz ich eine passende Abfrage aufbauen kann?

Danke im Voraus.
 

Anhänge

  • tut1.jpg
    tut1.jpg
    74 KB · Aufrufe: 14
item: Dein erstes Query ist nicht schlecht. Du solltest aber die Daten ausfilern bevor du sie gruppierst.
Die Reihenfolge ist die folgende

WHERE -> GROUP BY -> HAVING

item: hast du id IN (rückbuchungen). Du willst aber nur ids haben die keine Rückbuchungen haben.

In etwa so etwas sollte funktionieren
SQL:
SELECT 
	*, 
	COUNT(*) AS anzahl 
FROM 
	`user_konto_logs` 
WHERE
	id NOT IN (SELECT rueckbuchungID FROM user_konto_logs WHERE rueckbuchungID>0)
	AND art="wetten+" 	
GROUP BY 
	user,
	betrag,
	waehrung,
	art,
	details,
	rueckbuchungID 	
HAVING 
	COUNT(*)>=2 
ORDER BY 
	zeit DESC
 
Zuletzt bearbeitet von einem Moderator:
Super. :)
Allerdings kann ich den Query leider nicht testen, da phpMyAdmin mir nach dem Abschicken der Abfrage einige Zeit überlastet zu sein scheint ("The page you are looking for is temporarily unavailable.").
Die getestete Tabelle ist 16,2 MiB groß und besteht aus knapp 280.000 Zeilen. Ist das schon zuviel?
 
Zurück