Distinct

kova

Mitglied
hallo

warum funktioniert nicht der DISTINCT obwohl keine fehler drin sind

CODE $query2="SELECT DISTINCT P.userid, P.url, P.id,
P.open, P.facetoface_pro, P.facetoface_contra
FROM $sqltable_pics P left outer join $usertable
U on (P.userid = U.id) WHERE(U.code='1') and
(P.open='1') and U.geschlecht='m' ORDER BY round
((100*P.facetoface_pro)/(P.facetoface_contra+
P.facetoface_pro),2) DESC LIMIT 0,10";
$result2 = mysql_query($query2) or die(mysql_error());


soll eigentlich nur ein bild pro user einzeigen.
 
Entweder leihst du uns deine Glaskugel, oder stellst noch brauchbare Angaben dazu
wink.gif
Datenbankaufbau? Was gibt dieses Query z.B. im phpmyadmin aus? Distinct kürzt nur alle über den Select-Bereich identischen Datensätze. Gruppieren/Zusammenfassen geht so nicht.

So wie ich das beurteilen kann, sind pro Benutzer mehrere Bilder abgelegt oder? Und du möchtest einfach alle User mit je einem Bild kriegen, oder? Falls ja, müsstest du noch mit group by U.id oder so arbeiten.
 
QUOTE (kova @ So 19.2.2006, 16:49) [...] warum funktioniert nicht der DISTINCT obwohl keine fehler drin sind [...]

Ich glaube der Fehler liegt beim Anwender, DISTINCT wird schon richtig funktioneren. Oder gibt die Abfrage etwa zwei komplett identische Datensätze aus, in dem alle diese Felder gleich sind: "P.userid, P.url, P.id, P.open, P.facetoface_pro, P.facetoface_contra"?



MfG Sascha Ahlers
 
die fehler sind nicht gleich
QUOTE Felder gleich sind: "P.userid, P.url, P.id, P.open, P.facetoface_pro, P.facetoface_contra"?



nur die P.userid ist gleich bei jedem bild. Deswegen soll distintc die userid nicht wieder hollen alles, aber wenn ich die restlichen felder wege lassen bekomme ich die genau anzahl der userid`s aber das bild wird dann nicht angezeigt und das restliche.
 
QUOTE (Alonso @ So 19.2.2006, 19:53) So wie ich das beurteilen kann, sind pro Benutzer mehrere Bilder abgelegt oder? Und du möchtest einfach alle User mit je einem Bild kriegen, oder? Falls ja, müsstest du noch mit group by U.id oder so arbeiten.

Ich wiederhole mich ungerne..
wink.gif
 
jo es funktioniert mit GROUP by userid bloss es gibt noch ein hacken dabei. es liest das erste bild das der user hochgeladen aber nicht das meinst bewerteste.

CODE SELECT P.userid, P.url, P.open, P.facetoface_pro, P.facetoface_contra FROM $sqltable_pics P left outer join $usertable U on (P.userid = U.id) WHERE(U.code='1') and (P.open='1') and U.geschlecht='m' GROUP BY P.userid ORDER BY round((100*P.facetoface_pro)/(P.facetoface_contra+P.facetoface_pro),2) DESC LIMIT 0,10
 
QUOTE (kova @ Mo 20.2.2006, 15:00)nur die P.userid ist gleich bei jedem bild. Deswegen soll distintc die userid nicht wieder hollen alles, aber wenn ich die restlichen felder wege lassen bekomme ich die genau anzahl der userid`s aber das bild wird dann nicht angezeigt und das restliche.

Ja, das ist ja gerade der entscheidene Punkt, wenn irgendwo ein Datensatz erscheinen würde in dem diesen ganzen Felder gleich sind, wäre es ein Fehler, aber nicht, wenn nur eines der Felder in den einzelnen Datensätzen gleich ist. Somit funktioniert die DISTINCT-Anweisung doch richtig und der Fehler liegt innerhalb der Abfrage begründet. Distinct bezieht sich hierbei auf den kompletten Datensatz und nicht nur auf das erste Feld, es ist in etwa das Gleiche wenn man mehrere Felder bei der GROUP-BY-Anweisung angeben würde.

Um jetzt wegen der Bewertung zu schauen, müsste man überhaupt mal wissen, in welchen Feld die Bewertung gespeichert bzw. auch wie diese gespeichert wird. Für mich wird es zumindestens so nicht ersichtlich, wie Du diese Bewertung speicherst.
Meine Vermutung wäre so, dass die Tabelle wohl nicht vernünftig normalisiert wurde.



MfG Sascha Ahlers
 
QUOTE Meine Vermutung wäre so, dass die Tabelle wohl nicht vernünftig normalisiert wurde.



wie meinst du des??


CODE DROP TABLE IF EXISTS backend_pics;
CREATE TABLE backend_pics (
id smallint(6) NOT NULL auto_increment,
url varchar(250) NOT NULL default '',
userid smallint(6) NOT NULL default '0',
date int(11) NOT NULL default '0',
opendate int(11) NOT NULL default '0',
open enum('0','1') NOT NULL default '0',
facetoface_pro int(10) NOT NULL default '0',
facetoface_contra int(10) NOT NULL default '0',
points int(11) NOT NULL default '0',
main char(1) NOT NULL default '0',
ip varchar(255) NOT NULL default '0',
host varchar(255) NOT NULL default '0',
PRIMARY KEY (id),
UNIQUE KEY id (id)
) TYPE=MyISAM;

so sieht die tabelle aus wo die bewertung gespeichert wird. Und zwar in positiven und negativen bewertungen daraus wird dann der prozent satz gewonnen. Durch diesen code "round((100*P.facetoface_pro)/(P.facetoface_contra+P.facetoface_pro),2)" und nach diesem code wird es auch sortiert.
 
Nun, an der Abfrage ist nichts falsch, doch vielleicht hast Du vergessen, dass die GROUP-BY-Klausel viele Datensätze im Vorfeld herauswirft, in denen sich auch Bewertung befinden können.


Zu Deiner anderen Frage, dass war eine Vermutung. Nur wenn Du die Bilder nach Ihrer Bewertung liesten möchtest, und die Bilder nicht doppelt vorkommen können, frage ich mich, warum Du genau keine doppelten Benutzerids haben möchtest.
Eine Ausführlichere Beschreibung wäre wirklich angebracht, was möchtest Du genau machen, und welche Daten hast Du? So komme ich eigentlich auch wieder zu meiner Vermutung, dass die Tabelle vielleicht nicht richtig normalisiert wurde auf die gewünschten Bedürfnisse (ich verstehe halt unter "vernünftig normalisiert" → den Bedürfnissen, welche an das Programm gestellt werden, am Besten entsprechend).



MfG Sascha Ahlers
 
man kanns doch irgendwie machen das es funktioniert. Es funktioniert aber es lies nicht das höchts bewertet bild aus der datenbank.

ich weiß nicht mehr weiter was muss ich den da nun an der sql verändern das es funktioniert.
 
QUOTE (kova @ Di 21.2.2006, 13:15) [...]
ich weiß nicht mehr weiter was muss ich den da nun an der sql verändern das es funktioniert.

Das kann ich Dir so nicht sagen, dazu bäuchte ich etwas mehr informationen als nur die Abfrage und die Struktur der Tabelle. Ich müsste schon mal ganz genau wissen, was Du machen möchtest und wieso Du unbedingt jede Benutzer-ID nur einmal innerhalb Deiner Abfrage verwerten möchtest.
Hast Du einfach mal die GROUP-BY-Klausel herausgenommen?



MfG Sascha Ahlers
 
ich hab eine topliste auf meiner flirt seite da werden die männer von frauen unterschieden also zwei verschieden toplisten. Der gund ist warum ich nur eine benutzer-id haben will weil eine benutzer wird dann mehrmals in der topliste aufgelistet und des wäre den anderen gegenüber unfähr weil die vielleicht um 0,86 % unter den anderen benutzer liegen.

hier kannst du es sehen wie es im moment ist: Mänmliche Top 10

 
Zurück
Oben