php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 26.02.2005, 20:22  
Erfahrener Benutzer
 
Registriert seit: 21.07.2004
Beiträge: 101
GeorgM
Standard MySQL - Variablenproblem

Hallo!

(sql - code unten)

Ich hab' hier ein Problem mit Variablen in MySQL.
das problem ist:
=> die Spalte "nummer" wird richtig angezeigt (von eins an hochgezählt)
=> aber wenn ich die Variable @nummer in einer extra Spalte anzeigen lassen will (zum Test), steht da in jeder Zelle 0 !!
=> auch Variable @platz ist null, also dadurch auch die Spalte "platz"

Was ich durch den SELECT erreichen will ist die Rangliste einer Abstimmung - d.h. wenn zwei "tracks" gleich viele votes bekommen haben, sollen sie auch den gleichen Platz bekommen.

Ich hoffe, Ihr versteht, was ich meine und könnt mir helfen.
danke im Voraus,
Georg

hier der Anfang der SQL-Abfrage (die eigentlich noch viel länger ist):
--> ich hab' ihn schon mit phpMyAdmin getestet

"COUNT(tom_votes.trackID)" ist die Anzahl der Stimmen

Code:
SET @nummer := 0;

SET @platz := 1;

SELECT
  @nummer := @nummer +1 as nummer,
  IF(
    @votes = COUNT(tom_votes.trackID),
    @platz,
    @platz := @nummer
  ) as platz,
  @nummer,
  @votes := COUNT(tom_votes.trackID) as votes,

usw.
__________________
[php:1:f3a0cfcfa4]$hallo = array("Guten Morgen", "Guten Tag", "Guten Abend");
for($i=0;$i<2;$i++) {echo $hallo[$i]."<br>";}[/php:1:f3a0cfcfa4]
GeorgM ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 26.02.2005, 23:34  
Erfahrener Benutzer
 
Registriert seit: 30.06.2004
Beiträge: 619
tapferesschneiderlein
Standard

Es gibt manchmal Probleme bei der Zuweisung der Variablen. Das heißt, insbesondere bei Verwendung der GROUP-Funktion )was ich jetzt nicht sehe, aber annehme) wird die Variable erst dann zugewiesen, wenn das Ergebnis an den Client übertragen wird und steht dann bei der nächsten Abfrage richtig.
Ob das ein Bug oder Feature ist, weiß ich nicht.

Hier mein Beitrag zum inoffiziellen Wettbewerb um den umständlichsten Code:
Code:
CREATE TEMPORARY TABLE votes 
    SELECT id, COUNT( tom_votes.trackID ) AS votes
    FROM tabelle 
    # ...
    ;




        
CREATE TEMPORARY TABLE ranking (
    rank INT (11) UNSIGNED NOT NULL AUTO_INCREMENT, 
    votes INT (11) UNSIGNED NOT NULL, 
    PRIMARY KEY( rank, votes )
    ); 

INSERT INTO ranking 
    SELECT NULL, votes 
    FROM votes 
    GROUP BY votes DESC;

SELECT ranking.rank, votes.id, votes.votes
FROM votes
LEFT JOIN ranking ON ranking.votes = votes.votes
ORDER BY ranking.rank;
Vielleicht kommst Du so weiter ...
tapferesschneiderlein ist offline   Mit Zitat antworten
Alt 27.02.2005, 21:54  
Erfahrener Benutzer
 
Registriert seit: 21.07.2004
Beiträge: 101
GeorgM
Standard

Hallo tapferes Schneiderlein !

Danke für Deine Antwort. Leider ist das Problem noch nicht gelöst. Denn ich will ja erreichen, dass die Spalte "rank" nicht nur hochgezählt wird, sondern - wenn die Votesanzahl mit dem vorigen Eintrag übereinstimmt - rank gleich rank der vorigen Spalte ist

kompliziert.

ich poste mal ein Beispiel - Ergebnis sieht dann so aus (Spalten "nummer", "trackID" und "trname" entnommen) :

Code:
platz - votes - trackID
-----------------------
1     - 13    - 111
2     - 11    - 221
2     - 11    - 935
4     - 7     - 987
5     - 6     - 77
5     - 6     - 23
5     - 6     - 1
Und hier die komplette SQL-Abfrage:

Code:
SET @nummer := 0;

SET @platz := 1;

SELECT
  @nummer := @nummer +1 as nummer,
  IF(@votes = COUNT(tom_votes.trackID), @platz := @platz, @platz := @nummer) as platz,
  @votes := COUNT(tom_votes.trackID) as votes,
  tom_tracks.trackID as trackID,
  tom_tracks.name as trname
FROM
  tom_member,
  tom_tracks,
  tom_monate,
  tom_votes
WHERE
  tom_monate.jahr = 2003 AND tom_monate.monat = 8
 AND
  tom_votes.monatID = tom_monate.monatID
 AND
  tom_tracks.monatID = tom_monate.monatID
 AND
  tom_tracks.trackID = tom_votes.trackID
 AND
  tom_member.memberID = tom_votes.voterID
GROUP BY
  tom_votes.trackID
ORDER BY
  votes DESC,
  trname ASC
weiß jemand weiter?
__________________
[php:1:f3a0cfcfa4]$hallo = array("Guten Morgen", "Guten Tag", "Guten Abend");
for($i=0;$i<2;$i++) {echo $hallo[$i]."<br>";}[/php:1:f3a0cfcfa4]
GeorgM ist offline   Mit Zitat antworten
Alt 27.02.2005, 22:31  
Erfahrener Benutzer
 
Registriert seit: 30.06.2004
Beiträge: 619
tapferesschneiderlein
Standard

Hallo,

ich kenne die Struktur nicht genau und bin eher ein Vertreter der JOIN-Schreibweise, aber kannst Du mal die folgende Abfrage über Deine DB hetzen, damit ich mal sehe, ob wir dasselne meinen ...?

Code:
CREATE TEMPORARY TABLE votes
SELECT
  tom_tracks.trackID AS id,
  COUNT( tom_votes.trackID ) AS votes
FROM
  tom_member,
  tom_tracks,
  tom_monate,
  tom_votes
WHERE
  tom_monate.jahr = 2003 AND tom_monate.monat = 8
 AND
  tom_votes.monatID = tom_monate.monatID
 AND
  tom_tracks.monatID = tom_monate.monatID
 AND
  tom_tracks.trackID = tom_votes.trackID
 AND
  tom_member.memberID = tom_votes.voterID
GROUP BY
  tom_votes.trackID;
       
CREATE TEMPORARY TABLE ranking (
    rank INT (11) UNSIGNED NOT NULL AUTO_INCREMENT,
    votes INT (11) UNSIGNED NOT NULL,
    PRIMARY KEY( rank, votes )
    );

INSERT INTO ranking
    SELECT NULL, votes
    FROM votes
    GROUP BY votes DESC;

SELECT ranking.rank, votes.id, tom_tracks.name AS trname, votes.votes
FROM votes
LEFT JOIN ranking ON ranking.votes = votes.votes
LEFT JOIN tom_tracks ON tom_tracks.trackID = votes.id
ORDER BY ranking.rank;
tapferesschneiderlein ist offline   Mit Zitat antworten
Alt 28.02.2005, 16:01  
Erfahrener Benutzer
 
Registriert seit: 21.07.2004
Beiträge: 101
GeorgM
Standard

mensch, vielen vielen Dank für deine Mühe! Jetzt weiß ich wenigstens, dass man indizes auch über mehrere Tabellen anlegen kann
alles funktioniert genau so, wie ich es wollte!
(Außerdem kenn ich jetzt auch JOINs )

:thumbsup:

Edit:

halt - stimmt noch nicht ganz

Leider zählt der Primary key einfach plus eins, auch wenn es davor z.B. zwei zweite Pläzte gab. Wie ist das zu lösen?
__________________
[php:1:f3a0cfcfa4]$hallo = array("Guten Morgen", "Guten Tag", "Guten Abend");
for($i=0;$i<2;$i++) {echo $hallo[$i]."<br>";}[/php:1:f3a0cfcfa4]
GeorgM ist offline   Mit Zitat antworten
Alt 28.02.2005, 16:23  
Moderator
 
Benutzerbild von robo47
 
Registriert seit: 03.09.2004
Beiträge: 11.792
PHP-Kenntnisse:
Fortgeschritten
robo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz sein
Standard

das soll so sein, der primarykey soll ein eindeutiger identifier sein.

mfg
robo47
robo47 ist offline   Mit Zitat antworten
Alt 28.02.2005, 16:26  
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von GeorgM
Leider zählt der Primary key einfach plus eins, auch wenn es davor z.B. zwei zweite Pläzte gab. Wie ist das zu lösen?
16.16. Meine IDs haben Lücken - wie vergebe ich sie neu?
http://www.php-faq.de/q/q-sql-ids.html
  Mit Zitat antworten
Alt 28.02.2005, 16:45  
Erfahrener Benutzer
 
Registriert seit: 30.06.2004
Beiträge: 619
tapferesschneiderlein
Standard

> 16.16. Meine IDs haben Lücken - wie vergebe ich sie neu?

paßt hier, glaube ich, nicht so.

@GeorgM

Ok, das habe ich übersehen. Du willst also nach z. B. 2 zweiten Plätzen keinen 3. sondern einen vierten, ja?
tapferesschneiderlein ist offline   Mit Zitat antworten
Alt 28.02.2005, 16:50  
Erfahrener Benutzer
 
Registriert seit: 21.07.2004
Beiträge: 101
GeorgM
Standard

Zitat:
Zitat von tapferesschneiderlein
@GeorgM

Ok, das habe ich übersehen. Du willst also nach z. B. 2 zweiten Plätzen keinen 3. sondern einen vierten, ja?
ja, genau.
__________________
[php:1:f3a0cfcfa4]$hallo = array("Guten Morgen", "Guten Tag", "Guten Abend");
for($i=0;$i<2;$i++) {echo $hallo[$i]."<br>";}[/php:1:f3a0cfcfa4]
GeorgM ist offline   Mit Zitat antworten
Alt 28.02.2005, 17:26  
Erfahrener Benutzer
 
Registriert seit: 30.06.2004
Beiträge: 619
tapferesschneiderlein
Standard

Na dann sieht das ganze so aus, probier mal:
Code:
CREATE TEMPORARY TABLE votes (
    temp_rank INT (11) UNSIGNED NOT NULL AUTO_INCREMENT,
    PRIMARY KEY( temp_rank )
    )
SELECT
  tom_tracks.trackID AS id,
  COUNT( tom_votes.trackID ) AS votes
FROM
  tom_member,
  tom_tracks,
  tom_monate,
  tom_votes
WHERE
  tom_monate.jahr = 2003 AND tom_monate.monat = 8
 AND
  tom_votes.monatID = tom_monate.monatID
 AND
  tom_tracks.monatID = tom_monate.monatID
 AND
  tom_tracks.trackID = tom_votes.trackID
 AND
  tom_member.memberID = tom_votes.voterID
GROUP BY
  tom_votes.trackID
ORDER BY 2 DESC;


CREATE TEMPORARY TABLE ranking (
    rank INT (11) UNSIGNED NOT NULL,
    votes INT (11) UNSIGNED NOT NULL,
    PRIMARY KEY( votes )
    );
INSERT INTO ranking 
SELECT MIN( temp_rank ), votes 
FROM votes
GROUP BY votes DESC;

SELECT ranking.rank, votes.id, tom_tracks.name AS trname, votes.votes
FROM votes
LEFT JOIN ranking ON ranking.votes = votes.votes
LEFT JOIN tom_tracks ON tom_tracks.trackID = votes.id
ORDER BY ranking.rank;
Edit: Seit dem phpfriend.de-Update vor ein paar Minuten gibt's Probleme mit Sonderzeichen. Hier nochmal ohne Tags:

CREATE TEMPORARY TABLE votes (
temp_rank INT (11) UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY( temp_rank )
)
SELECT
tom_tracks.trackID AS id,
COUNT( tom_votes.trackID ) AS votes
FROM
tom_member,
tom_tracks,
tom_monate,
tom_votes
WHERE
tom_monate.jahr = 2003 AND tom_monate.monat = 8
AND
tom_votes.monatID = tom_monate.monatID
AND
tom_tracks.monatID = tom_monate.monatID
AND
tom_tracks.trackID = tom_votes.trackID
AND
tom_member.memberID = tom_votes.voterID
GROUP BY
tom_votes.trackID
ORDER BY 2 DESC;


CREATE TEMPORARY TABLE ranking (
rank INT (11) UNSIGNED NOT NULL,
votes INT (11) UNSIGNED NOT NULL,
PRIMARY KEY( votes )
);
INSERT INTO ranking
SELECT MIN( temp_rank ), votes
FROM votes
GROUP BY votes DESC;

SELECT ranking.rank, votes.id, tom_tracks.name AS trname, votes.votes
FROM votes
LEFT JOIN ranking ON ranking.votes = votes.votes
LEFT JOIN tom_tracks ON tom_tracks.trackID = votes.id
ORDER BY ranking.rank;
tapferesschneiderlein ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] Kein Ergebnis bei SELECT (MySQL 4.1.9) dr.e. Datenbanken 4 15.06.2008 19:54
[Erledigt] MySQL - ERROR 1044 bei erstellen einer Datenbank _youngenterpriser_ Datenbanken 2 05.02.2008 17:56
Mysql Server Einstellunen Optimieren pchero Datenbanken 3 01.05.2007 19:50
MySQL Abfrage von Ver. 5 für Ver 3. des MySQL Servers FireFIghter Datenbanken 3 02.02.2007 17:18
Kein Zugriff über ODBC mit der IP-Adresse auf MySql DB Datenbanken 4 09.02.2006 11:04
[Erledigt] Mysql 4.1.x unter php 4.3.9 Datenbanken 3 15.11.2005 13:49
Wieso funktioniert mein MySQL nicht mehr ? Skazi Datenbanken 1 09.11.2005 14:49
Schnittstelle zwischen PHP und MySQL klappt net !!! Datenbanken 16 16.10.2005 14:24
[Erledigt] not allowed to connect to this MySQL server PHP Tipps 2005-2 2 23.09.2005 18:34
MySQL &amp;amp; PHP: Problem mit Password() Datenbanken 10 19.09.2005 11:00
Suche Tipps für Persormance-Steigerung (Geld für Nützliches) Beitragsarchiv 18 16.08.2005 10:57
MYSQL läuft nur wenn /tmp auf 777 Datenbanken 5 06.07.2005 08:38
mysql root passwort vergessen Datenbanken 1 29.05.2005 11:33
Access denied for user: '@localhost' / SYSTEM@localhost Datenbanken 0 10.11.2004 20:35
[Erledigt] PHP5 &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;a m p; MySQL Datenbanken 5 01.08.2004 05:47

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
mysql rank, mysql rangliste erstellen mit temp table, create temporary table php schreibweise, mysql as nummer

Alle Zeitangaben in WEZ +2. Es ist jetzt 05:37 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.