Problem mit SQL-Statement (mit Inner Join)

noname17

Ensign
Registriert
Mai 2007
Beiträge
180
Hi all,

ich versuche seit ein paar stunden folgende Abfrage hinzukriegen:

Code:
SELECT `data`.`despatcher` , count( `data`.`despatcher` ) , `db`.`Division` ,  
FROM `data` 
INNER JOIN `db` ON `data`.`despatcher` = `db`.`email` 
GROUP BY `data`.`despatcher` 
ORDER BY count( `data`.`despatcher` ) DESC 
LIMIT 0 , 10

******

Es soll eigentlich die werte der tabelle "data" inklusive des wertes "division" aus der Tabelle "db" auslesen. Und zwar nur die 10 Top Sender.
Die Tabellen haben als ID die Email-Adresse (ich weiss ist nicht so sauber, aber die E-Mail ist jeweils unique). wenn ich diese Abfrage jedoch ausführe, bleibt mein MySQL-Server meist hängen und gibt nach 60 Sekunden eine Timeout Fehlermeldung aus.

ich hoffe ihr könnt mir helfen.

Danke im Voraus
 
Zuletzt bearbeitet:
Wie viele Datensätze sind da drin?
Kopiere die Tabelle mal und erstelle sie mit weniger Datensätzen, nur zum Test
 
Also. Das ist vielleicht der haken an der sache, hab ich noch vergessen zu sagen.

In den Tabellen sind rund je 130 Datensätze

Ich kann es mal probieren, doch was ich komisch finde.

wenn ich

WHERE email = blabla (eine spezifische email-adresse), geht die abfrage in null komma nix
 
Zuletzt bearbeitet:
dann mach doch where a.despacher = b.email
from data a, despatcher b

edit: wasn das für ne datenbank?
 
@Riod

Danke für deine Antwort, doch leider gibt es schon wieder einen "timeout". Hat vielleicht sonst noch jemand ne idee?


EEEDIT: Sorry, ich hab wohl etwas geschlafen, die DB hat etwa 130 Einträge (je) und ist für ein Persönliches projekt^^
 
Zuletzt bearbeitet:
^Sorry, ich muss wohl gepennt haben, es sind natürlich nur 130 Einträge pro DB
 
Ich weiß nicht mit welcher Datenbank Du arbeitest, aber MySQL kennt keine zwei Argumente innerhalb der Funktion COUNT(). Habe das gerade bei mir, weil ich mir nicht ganz sicher war, auch noch mal getestet und ich bekomme einen Error zurück.

Zu den Datensätzen:
Also 130 Datensätze sind ein Witz! Das stellt absolut keine Herausforderung für den Server da. Probier es mal mit nur einem Argument innerhalb der Funktion COUNT und benenn sie am Besten, so dass er beim ORDER BY nicht noch mal erneut zählen muss.
 
in ORACLE:

select disp,coun,div from
(SELECT a.despatcher disp, count( a.despatcher ) coun, b.Division div,
FROM data a,db b
where a.despatcher=b.email
GROUP BY a.despatcher,b.Division
ORDER BY count(a.despatcher) DESC
)
where rownum<11;


bitte schön :)

edit:
ich denke bei dir könnte es so gehen:

SELECT `data`.`despatcher` , count( `data`.`despatcher` ) , `db`.`Division` ,
FROM `data`
INNER JOIN `db` ON `data`.`despatcher` = `db`.`email`
GROUP BY `data`.`despatcher` , `db`.`Division`
ORDER BY count( `data`.`despatcher` ) DESC
LIMIT 0 , 10
 
Zuletzt bearbeitet:
Vielen Dank für die Tipps. Ich werde sie so bald als möglich ausprobieren, und melde mich wieder obs geklappt hat.

THX
 
Also, erstmal sorry dass ich mich so lange nicht gemeldet habe.
Leider besteht das Problem noch immer.

Ich habe aber gemerkt. dass in der tabelle 2 (db) nicht in jedem datensatz eine Email-adresse vorhanden ist. könnte es eventuell daran liegen? In der Tabelle 1 (data) ist in jedem datensatz eine email vorhanden.
 
nein!
das Funktioniert.

Es liegt definitiv nicht am SQL oder dem Tabellen inhalten. Andernfalls muss eine Fehlermeldung kommen.
 
Hm. Vllt liegt es am Tabellenformat. Es ist MyISAM.
Aber das sollte an und für sich ja auch kein Problem sein, weil ich ja mit dem Inner join eine "Virtuelle" Tabelle mache :s
 
MyISAM und MySQL kenne ich leider nicht.
Kannst du eine View zwischen den Tabellen anlegen und darüber Selektieren? Aber eventuell gibts das auch nicht bei MySQL.
 
Ich habe keine große Ahnung von MySql, aber generell hat ein Timeout doch so gut wie immer etwas mit nicht abschließenden Transaktionen zu tun. Dass sich hier 2 Transaktionen gegenseitig blockieren hast du ausgeschlossen? Ansonsten ist vielleicht irgendwas in der MySql-Konfiguration kaputt - hast Du was am AutoCommit umgestellt?

An der Datenmenge liegts definitiv nicht, relationale Datenbanken sind da einiges mehr gewöhnt. Ich habe schon eine stinknormale DB2-Tabelle mit etwa 450 Mio. Datensätzen (~300 GB) gesehen, und ein Select rattert da in Sekundenbruchteilen drüber.
 
So, bitte führ diese Query einfach mal bei Dir aus und sag, ob sie einerseits Ergebnisse liefert und andererseits, innerhalb welcher Zeit sie ausgeführt wird.

Um die Performance zu steigern, wäre es darüber hinaus sinnvoll einen INDEX auf das Feld despatcher aus der Tabelle data zu setzen.

Code:
SELECT a.despatcher, COUNT(a.despatcher) AS anzahl FROM `data` a LEFT JOIN `db` b ON a.despatcher = b.email GROUP BY a.despatcher ORDER BY anzahl DESC LIMIT 0, 10
 
Zuletzt bearbeitet:
Zurück
Oben