myGully.com

myGully.com (https://mygully.com/index.php)
-   Entwicklung & Programmierung (https://mygully.com/forumdisplay.php?f=72)
-   -   mysql abfrage (https://mygully.com/showthread.php?t=2917158)

grendl 02.05.13 19:17

mysql abfrage
 
vielleicht kann mir wer helfen. habe gegoogelt bis zum gehtnichtmehr.

brauche eine abfrage, die mir doppelte datensätze liefert und davon die mit den niedrigeren ids

struktur: id, userid, score, ip, gameid, date, published

z.b.:


id userid score ip gameid date published
1 62 12 91.114.220.84 4 2010-01-24 12:43:33 1
2 62 20730 233.183.91.69 3 2010-06-02 00:15:17 1
3 62 1889 233.183.91.69 17 2010-02-26 13:51:21 1
4 62 1889 233.183.91.69 12 2010-02-26 13:51:21 1
6 75 36140 94.114.217.99 334 2010-10-14 12:49:33 1
7 65 11625 174.191.197.2 464 2010-10-05 15:55:23 1
8 75 3045 94.114.213.15 8 2011-01-07 20:18:56 1
10 65 3140 242.183.50.94 8 2011-01-08 10:05:06 1

so - also ich möchte von oberen daten nur die id "3" mit allen spalten - userid, score, ip und date sind gleich und davon den datensatz mit der niedrigern "id".

kann das wer - es sind insgesamt ca. 10.000 datensätze und auf 500 oder so trifft das zu..

hilfe

:cry:

kkhamburg 02.05.13 21:37

Das geht mit JOIN. Einfach die gleiche Datenbank per JOIN und den entsprechenden Bedingungen abfragen.

grendl 03.05.13 00:18

sorry - bin ein völliger anfänger - JOIN reicht mir leider nicht

hiermit kann ich alle doppelten anzeigen:

SELECT COUNT(*), score, date FROM arc_jvarcade
GROUP BY score, date
HAVING COUNT(*)>1

das problem ist, es sind nicht immer die richtige - es sollten nur die mit der niedrigeren "id" sein - kommt in meiner abfrage gar nicht vor - aber wie einfügen ??????

NetWebs 03.05.13 05:51

Bei deiner Wissensbasis reicht googlen nicht.
Du musst dich schon mit SQL auseinandersetzen.

Keine Lust dazu?
Ist das ein kommerzielles Projekt?

grendl 03.05.13 08:50

Zitat:

Zitat von NetWebs (Beitrag 24539472)
Bei deiner Wissensbasis reicht googlen nicht.
Du musst dich schon mit SQL auseinandersetzen.

Keine Lust dazu?
Ist das ein kommerzielles Projekt?

Ach was - ich habe eine webseite in joomla und die komponente "jvarcade" - nach der migration von "puarcade" sind da in der datenbank viele scores doppelt (von ca. 10000 sind 2000 betroffen) - sieht dann nicht gut aus.

so wichtig ist es nicht, dass ich meinen hochschulabschluss nachhole. aber ich finde es auch traurig, wenn die "wissenden" mir nicht helfen wollen - ist doch nur eine select-abfrage....:cry:

grendl 03.05.13 17:03

wissenbasis ist <0

aber ich sehe schon - hier wird mir nicht geholfen - jeder macht mich fertig anstatt die scheinbar ja so einfache abfrage einfach reinzuschreiben

kkhamburg 03.05.13 19:34

Soweit ich das sehe wirst du hier nicht fertig gemacht.

Fakt ist aber das du, statt selber deinen Kopf mal ein klein wenig anzustrengen, lieber den bequemen Weg gehen willst.

Ein einfaches googeln nach "Mysql doppelte Datensätze Join" hätte dich z.B. zu diesem Ergebnis geführt :

Zitat:

SELECT * from Zustaende AS t1
INNER JOIN Zustaende AS t2
ON t1.zahl<t2.zahl AND t1.id=t2.id
Das wirst du ja sicherlich für deine Anforderung umstellen können.

Epeos 03.05.13 20:16

Zitat:

SELECT COUNT(*), score, date FROM arc_jvarcade
GROUP BY score, date
HAVING COUNT(*)>1
ist schon gar nicht so schlecht. Mit
Code:

SELECT MIN(id) FROM arc_jvarcade
GROUP BY score, date
HAVING COUNT(*)>1

kriegst Du die jeweils die niedrigste id. Wenn Du tatsächlich den ganzen Datensatz haben willst, dann packst Du die in ein Subselect, so:

Code:

SELECT * FROM arc_ivarcade
WHERE id IN
(SELECT MIN(id) FROM arc_jvarcade
GROUP BY score, date
HAVING COUNT(*)>1
)

Achtung: Subselects sind in MySQL nicht immer performant. Kann also eine Weile laufen.

NetWebs 03.05.13 20:19

Zitat:

Zitat von Epeos (Beitrag 24541293)
Achtung: Subselects sind in MySQL nicht immer performant. Kann also eine Weile laufen.

Deshalb wird sowas auch mit einem JOIN gemacht!
Siehe erste Antwort...

Epeos 05.05.13 07:11

Zitat:

Zitat von NetWebs (Beitrag 24541302)
Deshalb wird sowas auch mit einem JOIN gemacht!
Siehe erste Antwort...

Da ich immer gerne dazu lerne: Wie sieht diese Abfrage denn mit JOIN und ohne Subselect aus???

kkhamburg 05.05.13 08:03

Die Frage ist doch bereits in diesem Thread beantwortet :rolleyes:

Epeos 05.05.13 08:22

Mea culpa, hatte in Deinem Quote das "t1.zahl<t2.zahl" überlesen. :eek:

Aber ob der JOIN bei der ON-Bedingung schneller ist, weiss wohl nur der Optimizer.

kkhamburg 05.05.13 08:41

Wenn du meinst.

Lustig aber das du JOIN gar nicht kanntest und selber schreibst das Subselects nicht performant sind.
Vielleicht solltest du JOIN erst einmal nutzen bevor du eine Meinung dazu abgibst.

Epeos 05.05.13 18:21

Wie kommst Du auf die Idee, ich kenne kein JOIN? Ich benutze das nur nicht mit "<"-Bedingung.

Übrigens habe ich grad mal getestet. Die Abfrage mit Subselect ist mit 10.000 Datensätzen deutlich schneller als die Abfrage per JOIN (auf meinem Rechner um den Faktor 2000). Hat sich bei MySQL in den letzten Versionen doch ein bisschen was getan.

NetWebs 05.05.13 19:28

Zitat:

Zitat von Epeos (Beitrag 24546413)
Übrigens habe ich grad mal getestet.

Du solltest dann mal ganz schnell Deine wissenschaftlichen Erkenntnisse in einem Fachmagazin veröffentlichen, denn fälschlicherweise dachte man in der Informatik und unter den DBAs, dass JOINS schneller als Subselects sind (bis auf Ausnahmen, falls die Datenbankstruktur von einem Amateur angelegt wurde o.ä.).

Aber gut, dass Du das rausgefunden hast. Ich werde morgen früh eine Mail an alle 50 Entwickler bei uns schreiben, dass Subselects schneller als JOINS sind und auf diesen Thread verweisen. Du hast es ja mal grad getestet. In der scheint ein unglaubliches Talent zu stecken... dass Du so eine Erkenntnis mal eben testen kannst ohne jemals eine DBA-Qualifikation gehabt zu haben. Suchst Du einen Job?

kkhamburg 05.05.13 21:25

Zitat:

Zitat von Epeos (Beitrag 24546413)
Wie kommst Du auf die Idee, ich kenne kein JOIN? Ich benutze das nur nicht mit "<"-Bedingung.

Wenn du JOIN doch kennst frage ich mich ernsthaft wieso du hier nach dem Syntax fragen musst. Da die Bedingung ON obligatorisch ist für JOIN liegt es wohl nicht so fern innerhalb der Bedingung mit allen verfügbaren Operatoren zu arbeiten.

Zitat:

Zitat von Epeos (Beitrag 24546413)
Übrigens habe ich grad mal getestet. Die Abfrage mit Subselect ist mit 10.000 Datensätzen deutlich schneller als die Abfrage per JOIN (auf meinem Rechner um den Faktor 2000). Hat sich bei MySQL in den letzten Versionen doch ein bisschen was getan.

Wenn das dein Ergebnis ist, solltest du dringend etwas an der Indizierung der abgefragen Datenbank tun. Warum das so ist verrät dir das Handbuch zu MySQL.

Da die Frage des TE beantwortet ist und er sich hier auch nicht mehr zu Wort meldet mache ich hier mal dicht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:15 Uhr.

Powered by vBulletin® (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.