Distinct über mehrere Tabellen

Hillary

Mitglied
Hallo,

ich habe 6 identische Tabellen. Die Einträge, geordnet nach Datum, rufe ich so ab:

PHP:
$sql1 = " 
SELECT ID, selbst, stats, spielnr, datum, ......
FROM tabelle1 
WHERE Spielnr != '0'
UNION
SELECT ID, selbst, stats, spielnr, datum,.....
FROM tabelle2 
WHERE Spielnr != '0'
UNION
SELECT ID, selbst, stats, spielnr, datum, ....
FROM tabelle3 
WHERE Spielnr != '0'
UNION
etc......
";

$sql2 = $sql1."ORDER BY datum DESC";

Allerdings sind zwei Spielnr immer identisch
(immer in 2 verschiedenen Tabellen). Angezeigt
werden soll aber lediglich einer (egal welcher!)

Wo packe ich hier ein Distinct ein?

GROUP funktioniert nicht. Die Datensätze mit gleicher spielnr
sind sonst unterschiedlich. Joins übersteigen noch mein Know-how.

Für Hilfe bin ich dankbar
 
Hi

warum hast Du 6 Tabellen?
Wo ist die Unterschiedlichkeit?
Evtl. entstehen Redundanzen, die nicht sein müssen.

Ein Union ist nicht gerade die performateste Lösung. ;)
 
Hallo Luzie

Luzie hat gesagt.:
warum hast Du 6 Tabellen?
Wo ist die Unterschiedlichkeit?

Da ich unterschiedliche und zahlreiche Auswertungen
zu den einzelnen Tabellen vornehme. Hierbei
habe ich versucht so viel wie möglich aus eigener Kraft
zu entwickeln. Mit dieser Lösung umging ich zahlreiche
Probleme, die noch eine härtere Nuss gewesen wären.
(Es gibt lediglich diese eine Abfrage über alle Tabellen)

Luzie hat gesagt.:
Ein Union ist nicht gerade die performateste Lösung

Die Nutzung wird sich auf wenige Zugriffe täglich beschränken.
Daher kann die Performance eher vernachlässigt werden.
(Hoffe diese Aussage demotiviert nicht)

Würde lediglich gerne die doppelte spielnr rauswerfen.
 
Ein GROUP BY über die spielnr müsste am Ende aller Unions eigentlich zum Ergebnis führen. Ein DISTINCT würde meines Wissens nur absolut identische Zeilen reduzieren.
Schau doch mal bei der Doku vorbei.
 
@hpvw

Danke!

Ich dachte es ist genau umgekehrt :confused:

GROUP BY funktioniert jedenfalls nicht. Es liegt
auch nicht am UNION ALL laut
deinem Link.
 
Hi

ich kann das jetzt leider in mySQL nicht testen, da meine Version union noch nicht unterstützt. Ein Group by funktioniert aber in Access am Ende aller Union-Auflistungen, das weiss ich.

Poste doch nochmal Dein Statement. Vielleicht hast Du das Group by an der falschen Stelle sitzen.

Wenn alles nix hilft, dann musst Du es halt im php-Script abfragen (rausfiltern).
 
Hallo,
wenn Du MySQL 4.1 hast, könntest Du die UNIONifizierten SELECTs in einem Subselect zusammenfassen und diesen dann mit GROUP BY nach Spielnr gruppieren. Etwa so in der Art:
Code:
SELECT * FROM
(
  SELECT
    id, selbst, stats, spielnr, datum, ...... 
  FROM
    tabelle1 
  WHERE
    spielnr != '0' 
UNION
  SELECT
    id, selbst, stats, spielnr, datum, ...... 
  FROM
    tabelle2
  WHERE
    spielnr != '0' 
UNION
  SELECT
    id, selbst, stats, spielnr, datum, ...... 
  FROM
    tabelle3 
  WHERE
    spielnr != '0' 
UNION
  etc...
) AS subselect

GROUP BY
  Spielnr
Martin
 
Hallo Luzie und Martin

Luzie hat gesagt.:
Poste doch nochmal Dein Statement. Vielleicht hast Du das Group by an der falschen Stelle sitzen.

($sql1 siehe oben. Aktuell mit UNION ALL)
PHP:
$sql2 = $sql1." 
GROUP BY spielnr 
ORDER BY datum DESC
";
ohne Group funktioniert es einwandfrei (mit doppelter SpielNr.)
mit auch, eben auch wie ohne.

Resalb hat gesagt.:
wenn Du MySQL 4.1 hast, könntest Du die UNIONifizierten SELECTs in einem Subselect zusammenfassen
Habe leider 4.0.24. Habs trotzdem mal versucht. Das Ergebnis war wie bei den meisten Experimenten: Nichts, nicht mal eine Fehlermeldung auf die es sich aufbauen lässt.

Werde mal schauen was sich per PHP anstellen lässt. Wobei ich noch immer überzeugt bin, dass es eine Lösung gibt, da lediglich die Tabellenanzahl der Knackpunkt scheint.
Oder vieleicht steckt die Lösung doch im Join. Ich bleib am Fall dran ;)
Danke Leute!
 
Habe die wichtigsten Aussagen meinerseits nochmal klarer dargestellt:

6 gleiche Tabellen, jede Menge zusammenhangsloser Datensätze drin.
Jeder Datensatz/Tabelle hat das Feld spielnr.
Zu jedem Datensatz gibt es in irgendeiner Tabelle einen Datensatz
mit der selben spielnr. - Aber: nur die spielnr ist identisch der Rest des DS nicht.

Welcher DS von beiden ausgegeben wird ist egal. D.h. die Hälfte aller DS in den
6 Tabellen soll ausgegeben werden, jede spielnr kommt nur 1x vor.
 
Hi Hillary,

bei einer zu Anfang unklug, mag sein, durch mangelndes Wissen oder weil's schnell gehen muss, erstellten Datenbankstruktur ist es nur sehr schwierig, an das gewünschte Ergebnis zu kommen.

Du wirst immer wieder Probleme mit Deinen 6 Tabellen bekommen. Ich sag das jetzt nicht, um die zu bevormunden, ich kenne es leider aus eigener Erfahrung ;)

Wenn Martins Vorgabe nicht funktionieren sollte, unterstützt Deine MySQL-Version tatsächlich keine Subselect.

Es gibt eine relativ einfache Möglichkeit, im php-Script doppelte Einträge auszuschließen. Allerdings muss im Order by der SQL-Anweisung nach diesem Feld sortiert werden, d.h. in Deinem Falle nach Spielnr. Man kann sich das ganze dann auch noch in einen Array speichern und so eine andere Sortierung (z.B. Datum) im Script vornehmen.

Zur Vorgehensweise: Du legst Dir eine Variable an und setzt den Wert auf nichts. Im Verlauf des Scirptes wird jede Nummer mit der nächsten vergleichen, deshalb auch die Sortierung. Wird eine gleiche Nummer im nächsten Zug gefunden, printet die Ausgabe des Datensatzes nur einmal.

PHP:
$testvar="";
do {
if($testvar == "" || $testvar != $row['spielnr']) {
		echo $row['spielnur']." ".$row['name']."<br>";
  	$testvar = $row['spielnr'];
  	}
}
while ($row=mysql_fetch_array($rs));

Dies ist eine Möglichkeit, Profis haben evtl. noch andere. Eine automatisierte SQL-Lösung fällt mir derzeit nicht ein, aber vielleicht jemand anderem noch.
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück