www.vorhilfe.de
- Förderverein -
Der Förderverein.

Gemeinnütziger Verein zur Finanzierung des Projekts Vorhilfe.de.
Hallo Gast!einloggen | registrieren ]
Startseite · Mitglieder · Impressum
Forenbaum
^ Forenbaum
Status VH e.V.
  Status Vereinsforum

Gezeigt werden alle Foren bis zur Tiefe 2

Navigation
 Startseite...
 Suchen
 Impressum
Das Projekt
Server und Internetanbindung werden durch Spenden finanziert.
Organisiert wird das Projekt von unserem Koordinatorenteam.
Hunderte Mitglieder helfen ehrenamtlich in unseren moderierten Foren.
Anbieter der Seite ist der gemeinnützige Verein "Vorhilfe.de e.V.".
Partnerseiten
Weitere Fächer:

Open Source FunktionenplotterFunkyPlot: Kostenloser und quelloffener Funktionenplotter für Linux und andere Betriebssysteme
Forum "Praxis" - PHP/MYSQL - Mit UNION vereinen
PHP/MYSQL - Mit UNION vereinen < Praxis < Informatik < Vorhilfe
Ansicht: [ geschachtelt ] | ^ Forum "Praxis"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien

PHP/MYSQL - Mit UNION vereinen: Frage (beantwortet)
Status: (Frage) beantwortet Status 
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

        
Bezug
PHP/MYSQL - Mit UNION vereinen: Antwort
Status: (Antwort) fertig Status 
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

Bezug
                
Bezug
PHP/MYSQL - Mit UNION vereinen: Frage (beantwortet)
Status: (Frage) beantwortet Status 
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

Bezug
                        
Bezug
PHP/MYSQL - Mit UNION vereinen: Fälligkeit abgelaufen
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 15:20 Mo 12.02.2007
Autor: matux

$MATUXTEXT(ueberfaellige_frage)
Bezug
                                
Bezug
PHP/MYSQL - Mit UNION vereinen: Frage (überfällig)
Status: (Frage) überfällig Status 
Datum: 22:42 Fr 16.02.2007
Autor: oli_k

...?

Bezug
                                        
Bezug
PHP/MYSQL - Mit UNION vereinen: Fälligkeit abgelaufen
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 23:20 Do 22.02.2007
Autor: matux

$MATUXTEXT(ueberfaellige_frage)
Bezug
                        
Bezug
PHP/MYSQL - Mit UNION vereinen: Antwort
Status: (Antwort) fertig Status 
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


Bezug
Ansicht: [ geschachtelt ] | ^ Forum "Praxis"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien


^ Seitenanfang ^
ev.vorhilfe.de
[ Startseite | Mitglieder | Impressum ]