PHP/MYSQL - Mit UNION vereinen < Praxis < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 16:50 Mi 31.01.2007 | Autor: | oli_k |
Hallo,
folgendes Problem (bin noch sehr neu in dem Thema):
Ich habe eine Tabelle mit zwei Spalten, der Einfachkeit halber nenne ich diese hier jetzt mal a und b. In beiden Spalten stehen Nummern, es können sowohl in Spalte a als auch in Spalte b identische Nummern vorhanden sein.
Nun sollen alle Nummern Punkte bekommen, in meinem Beispiel für jedes Erscheinen in Spalte a zehn Punkte und für jedes Erscheinen in Spalte b drei Punkte. Ich möchte nun eine Rangliste aller Nummern machen, sortiert nach den Punkten und natürlich darf jede Nummer nur einmal vorkommen in der Rangliste. Es muss auch berücksichtigt werden, dass eine Nummer auch z.B. 17*3+13*10 Punkte bekommen kann, die Häufigkeit also nicht beschränkt ist.
Mein Gedankengang war, zuerst mal mit SELECT zwei Datensätze zu bekommen, die den einzelnen Nummern jeweils die "3er-Punkte" (1. Datensatz) und jeweils die "10er-Punkte" (2. Datensatz) zuordnet. Das habe ich gemacht, in dem ich jeweils COUNT(*)*10 bzw. COUNT(*)*3 zusammen mit der Nummer in eine Zeile gebracht habe.
Diese beiden Datensätze wollte ich nun vereinen, hier komme ich allerdings nicht mehr weiter. Wenn ich es nach meiner Idee mache (ab hier fehlen mir auch weitergehende Kenntnisse..), ist das Vereinen solange kein Problem, solange keine Nummer in beiden Datensätzen vorkommt; Das heisst: Kommt die Nummer nur in a vor, habe ich im vereinten Datensatz die Nummer und die dazugehörigen Punkte aus a angezeigt. Selbiges für b. Kommt die Nummer in a und b vor, habe ich die Nummer und NUR DIE PUNKTE AUS a DABEI.
Wie bekomme ich es jetzt hin, dass er die Punkte aus a und b beim vereinen ADDIERT, und nicht ÜBERSCHREIBT?
Hier mein Code:
$resultset = mysql_query ( "(SELECT (COUNT(*) * 3) as Drei, a as Nr FROM haupttabelle GROUP BY a order by a asc) UNION (SELECT (COUNT(*) * 10) as Zehn, b as Nr FROM haupttabelle GROUP BY b order by b asc) ORDER BY Nr" );
Habe was von Subselect gehört, das verstehe ich aber immer noch nicht :(
Wäre für eine Lösung meines Problems sehr dankbar, könnt mir glauben, habe mich wirklich lange damit beschäftigt,
Oli
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 18:17 Fr 02.02.2007 | Autor: | Marc |
Hallo Oli,
> Habe was von Subselect gehört, das verstehe ich aber immer
> noch nicht :(
Ein Subselect ist einfach ein verschachtelter SELECT, der an Stelle des Tabellennamens steht, z.B.
SELECT count(*) FROM (SELECT author FROM articles GROUP BY author) AS meinsubselect;
Man kann sich das so vorstellen, dass aus dem inneren SELECT-Statement "SELECT author FROM articles GROUP BY author" eine temporäre Tabelle "meinsubselect" erstelllt wird und anschließend "SELECT count(*) FROM meinsubselect" darauf ausgeführt wird.
Auf die MatheRaum-Datenbank angewendet ergibt die obige Abfrage übrigens: 14566 (d.h., 14566 verschiedene Autoren haben Artikel in unser Forum gepostet).
Es kann sein, dass MySQL auf die Benennung des subselect verzichtet und man schreiben kann: "SELECT count(*) FROM (SELECT author FROM articles GROUP BY author)". PostgreSQL besteht jedenfalls auf die Benennung.
Deine Abfrage könnte man also so schreiben:
1: | SELECT Nr, sum(punkte) FROM (SELECT a AS Nr, 3 AS punkte FROM haupttabelle
| 2: | UNION
| 3: | SELECT b AS Nr, 10 AS punkte FROM haupttabelle) AS subselect
| 4: | GROUP BY Nr
| 5: | ORDER BY Nr |
oder etwas komplizierter, aber platzsparender:
1: | SELECT Nr, sum(punkte) FROM (SELECT a AS Nr, count(*)*3 AS punkte FROM haupttabelle GROUP BY Nr
| 2: | UNION
| 3: | SELECT b AS Nr, count(*)*10 AS punkte FROM haupttabelle GROUP BY Nr) AS subselect
| 4: | GROUP BY Nr
| 5: | ORDER BY Nr |
Viele Grüße,
Marc
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 15:08 Sa 10.02.2007 | Autor: | oli_k |
Hallo, habe es jetzt so gemacht:
"SELECT Nr, sum(Punkte) FROM ((SELECT (COUNT(*) * 3) as Punkte, a as Nr FROM haupttabelle GROUP BY Nr) UNION (SELECT (COUNT(*) * 10) as Punkte, b as Nr FROM haupttabelle GROUP BY Nr) AS subselect GROUP BY Nr ORDER BY Nr"
Und es kommt jedes mal bei
while($daten = mysql_fetch_object($resultset))
(
echo $daten->Nr; echo "---"; echo $daten->Punkte; echo "<br>";
)
die Fehlermeldung "supplied argument is not a valid MySQL result resource"... Was habe ich noch falsch gemacht? Die beiden Abfragen aus der Union funktionieren einzeln einwandfrei... Was ist noch falsch?
Danke
Oli
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 15:20 Mo 12.02.2007 | Autor: | matux |
$MATUXTEXT(ueberfaellige_frage)
|
|
|
|
|
Status: |
(Frage) überfällig | Datum: | 22:42 Fr 16.02.2007 | Autor: | oli_k |
...?
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 23:20 Do 22.02.2007 | Autor: | matux |
$MATUXTEXT(ueberfaellige_frage)
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 14:18 Do 22.02.2007 | Autor: | Marc |
Hallo Oli,
> "SELECT Nr, sum(Punkte) FROM ((SELECT (COUNT(*) * 3) as
> Punkte, a as Nr FROM haupttabelle GROUP BY Nr) UNION
> (SELECT (COUNT(*) * 10) as Punkte, b as Nr FROM
> haupttabelle GROUP BY Nr) AS subselect GROUP BY Nr ORDER BY
> Nr"
>
> Und es kommt jedes mal bei
> while([mm]daten = mysql_fetch_object([/mm]resultset))
> (
> echo [mm]daten->Nr; echo "---"; echo [/mm]daten->Punkte; echo
> "<br>";
> )
>
> die Fehlermeldung "supplied argument is not a valid MySQL
> result resource"... Was habe ich noch falsch gemacht? Die
> beiden Abfragen aus der Union funktionieren einzeln
> einwandfrei... Was ist noch falsch?
Verbinde Dich doch mal direkt mit der Datenbank, indem Du in einem Konsolenfenster eingibst
mysql -d datenbankname
Dort führe den SQL-Befehl manuell aus. Falls er fehlerhaft ist, sollte dort eine Fehlermeldung erscheinen.
Alternativ könntest Du auch mal im PHP-, Webserver-Log nachschauen, ob PHP die SQL Fehlermeldung vielleicht dort untergebracht hat.
Viele Grüße,
Marc
|
|
|
|