CronJob-Service
bei SELFPHP mit ...
|
+ minütlichen Aufrufen
+ eigenem Crontab Eintrag
+ unbegrenzten CronJobs
+ Statistiken
+ Beispielaufrufen
+ Control-Bereich
Führen Sie mit den CronJobs von
SELFPHP zeitgesteuert Programme
auf Ihrem Server
aus. Weitere Infos
|
:: Anbieterverzeichnis ::
Globale Branchen
Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP
:: Newsletter ::
Abonnieren Sie hier den kostenlosen
SELFPHP Newsletter!
|
MySQLi/PDO/(MySQL) Anfänger, Fortgeschrittene oder Experten können hier Fragen und Probleme rund um MySQLi/PDO/(MySQL) diskutieren |
22.01.2010, 15:40:27
|
Anfänger
|
|
Registriert seit: Jan 2010
Alter: 50
Beiträge: 2
|
|
Abfrage mit COUNT über mehrere Tabellen
Hallo,
ich betreibe eine Fotoseite und möchte die User ein wenig statistisch auswerten.
Dazu möchte in Tabelle '4images_comments' die Anzahl der abgegeben Kommentare und in '4images_images' die Anzahl der eingestellten Bilder zählen und ausgeben.
Ich benutze dazu folgenden Code:
Code:
SELECT 4images_users.user_name,
COUNT(4images_comments.user_id) AS noComments,
COUNT(4images_images.user_id) AS noImages
FROM 4images_users
NATURAL LEFT OUTER JOIN 4images_comments
NATURAL LEFT OUTER JOIN 4images_images
GROUP BY 4images_users.user_name
ORDER BY 4images_users.user_name
Die Ausgabe sieht wie folgt aus:
user_name....noComments..noImages
Andreas......115.........20
AndreasK.....0...........0
Angelsachse..709.........96
Anita........335.........54
apri.........240.........27
Bernd........24..........6
Caspar.......38..........2
chris........0...........0
Eisvogel.....279.........31
Flow.........4...........0
Frank........548.........105
...
Das sieht auf den ersten Blick auch richtig aus. Die Anzahl der Kommentare stimmt. Die Anzahl der Images nicht. Ich habe mit JOIN herumgespielt, bin aber zu keinem Ergebnis gekommen.
Ich würde mich über Hilfe freuen, da bei meinem Horizont in Sachen SQL ziemlich schnell die Dämmerung einsetzt.
Gruß Michi Müller
Geändert von Michi Müller (22.01.2010 um 16:03:21 Uhr)
|
22.01.2010, 19:24:52
|
Junior Member
|
|
Registriert seit: Oct 2008
Alter: 47
Beiträge: 274
|
|
AW: Abfrage mit COUNT über mehrere Tabellen
Du musst die beiden Tabellen Comments und Images getrennt voneinander zählen. Versuchs mal mit einer dieser zwei Abfragen:
Code:
SELECT u.user_name
, (SELECT COUNT(*)
FROM 4images_comments
WHERE user_id = u.user_id) AS noComments
, (SELECT COUNT(*)
FROM 4images_images
WHERE user_id = u.user_id) AS noImages
FROM 4images_users AS u;
Code:
SELECT u.user_name
, COALESCE(c.comment_count, 0) AS noComments
, COALESCE(i.image_count, 0) AS noImages
FROM 4images_users AS u
LEFT OUTER
JOIN ( SELECT user_id
, COUNT(*) AS comment_count
FROM 4images_comments
GROUP
BY user_id ) AS c
ON c.user_id = u.user_id
LEFT OUTER
JOIN ( SELECT user_id
, COUNT(*) AS image_count
FROM 4images_images
GROUP
BY user_id ) AS i
ON i.user_id = u.user_id;
Sorry dass ich die beiden Abfragen nicht näher erläutere, aber ich schreibe Queries lieber als das ich über sie rede. ;)
Wenn du noch etwas genauer wissen willst, dann frag einfach noch einmal nach.
|
22.01.2010, 22:16:24
|
Anfänger
|
|
Registriert seit: Jan 2010
Alter: 50
Beiträge: 2
|
|
AW: Abfrage mit COUNT über mehrere Tabellen
Hallo Crisps!
Deine erste Query ist PERFEKT! Wenn man sich das genau ansieht, scheint auch logisch zu sein.
Nur schade, dass ich nicht verstehe, warum meine Abfrage nicht so funktioniert, wie ich es mir vorstelle. :-(
Ich danke Dir recht herzlich.
Gruß Michi Müller
|
25.01.2010, 09:22:29
|
Member
|
|
Registriert seit: Nov 2007
Beiträge: 843
|
|
AW: Abfrage mit COUNT über mehrere Tabellen
hi
@Crisps
Zitat:
Zitat von Crisps
Sorry dass ich die beiden Abfragen nicht näher erläutere, aber ich schreibe Queries lieber als das ich über sie rede. ;)
|
Tun wir das nich alle ;) aber auch wenn die meisten hier nur Copy&Paste einer Lösung wollen
sollte man für googlesuchende schon ne kleine Erklärung hinterlassen.
Zitat:
Zitat von Crisps
Code:
SELECT u.user_name
, (SELECT COUNT(*)
FROM 4images_comments
WHERE user_id = u.user_id) AS noComments
, (SELECT COUNT(*)
FROM 4images_images
WHERE user_id = u.user_id) AS noImages
FROM 4images_users AS u;
|
Subselects sind meiner Meinung nach die einzige Lösung für Count's über mehrer Tabellen.
Wobei hier ein subselect gespart werden könnte z.B.
Code:
SELECT u.user_name
, COUNT(*) AS noComments
, (SELECT COUNT(*)
FROM 4images_images
WHERE user_id = u.user_id) AS noImages
FROM 4images_users AS u
LEFT JOIN 4images_comments AS co
on co.user_id=u.user_id
GROUP BY u.user_id;
@TE
Deine count abfrage hat seltsame werte denn meines wissen wird pro username * count * count von Mysql interpretiert was die Bilderanzahl mal Comments bedeuten würde.
mfg
Ckaos
__________________
"Wenn die Leute Häuser so bauen würden, wie wir Programme schreiben, würde der erstbeste Specht unsere Zivilisation zerhacken."
In den allermeisten Fällen sitzt der Bug etwa 40 cm vor dem Monitor!
|
26.01.2010, 08:33:48
|
Junior Member
|
|
Registriert seit: Oct 2008
Alter: 47
Beiträge: 274
|
|
AW: Abfrage mit COUNT über mehrere Tabellen
Zitat:
Zitat von Ckaos
hi
@Crisps
Tun wir das nich alle ;) aber auch wenn die meisten hier nur Copy&Paste einer Lösung wollen
sollte man für googlesuchende schon ne kleine Erklärung hinterlassen.
|
Wie gesagt, mir fällt es schwer eine Query irgendwie groß zu erklären. Deshalb auch das Angebot, dass man noch einmal nachfragen soll wenn man etwas nicht versteht.
Ich bin halt kein Informatiker und das typische Informatikerdeutsch schreckt mich auch ab.
Zitat:
Zitat von Ckaos
Wobei hier ein subselect gespart werden könnte z.B.
Code:
SELECT u.user_name
, COUNT(*) AS noComments
, (SELECT COUNT(*)
FROM 4images_images
WHERE user_id = u.user_id) AS noImages
FROM 4images_users AS u
LEFT JOIN 4images_comments AS co
on co.user_id=u.user_id
GROUP BY u.user_id;
|
Ein Subselect weniger aber etwas 'langsamer' als die erste und etwa gleich schnell wie die zweite von mir gepostete Abfrage. Warum? Ich weiß es auch nicht. *kopfkratz*
|
26.01.2010, 09:20:31
|
Member
|
|
Registriert seit: Nov 2007
Beiträge: 843
|
|
AW: Abfrage mit COUNT über mehrere Tabellen
hi
Zitat:
Zitat von Crisps
Wie gesagt, mir fällt es schwer eine Query irgendwie groß zu erklären. Deshalb auch das Angebot, dass man noch einmal nachfragen soll wenn man etwas nicht versteht.
|
Das kann aber der der in 6monaten diesen Beitrag bei google findet vielleicht nichtmehr ;)
Verweise zu mysql.de oder tutorialseiten woher man sein wissen über das thema hat
wären nützlich dazu bedarf es keines fachchinesisch.
Zitat:
Zitat von Crisps
Ein Subselect weniger aber etwas 'langsamer' als die erste und etwa gleich schnell wie die zweite von mir gepostete Abfrage.
|
Wie würdest du das beweisen wenn ich es in frage stelle?
mfg
Ckaos
__________________
"Wenn die Leute Häuser so bauen würden, wie wir Programme schreiben, würde der erstbeste Specht unsere Zivilisation zerhacken."
In den allermeisten Fällen sitzt der Bug etwa 40 cm vor dem Monitor!
|
26.01.2010, 12:04:55
|
Junior Member
|
|
Registriert seit: Oct 2008
Alter: 47
Beiträge: 274
|
|
AW: Abfrage mit COUNT über mehrere Tabellen
Zitat:
Zitat von Ckaos
Das kann aber der der in 6monaten diesen Beitrag bei google findet vielleicht nichtmehr ;)
Verweise zu mysql.de oder tutorialseiten woher man sein wissen über das thema hat
wären nützlich dazu bedarf es keines fachchinesisch.
|
Wenn jemand nach 6 Monaten nicht auf den "Antworten" Button klicken kann, kann ich ihm auch nicht helfen.
Zitat:
Zitat von Ckaos
Wie würdest du das beweisen wenn ich es in frage stelle?
|
Stell es doch in Frage, oder mach ein Benchmark - ist doch mir egal.
|
26.01.2010, 13:06:57
|
Member
|
|
Registriert seit: Nov 2007
Beiträge: 843
|
|
AW: Abfrage mit COUNT über mehrere Tabellen
Hi
@Crisp
Ich denk du weisst selber das es im Internet mehr als genug Forenbeiträge gibt
die einen nicht weiterbringen. Selbst erlebt habe ich das nach einem bestimmten Thema
gesucht ich mehr als 10 Foren inkl. Beiträge gefunden habe wo die selbe Frage gestellt
wurde und es aber nie eine Antwort oder eine nicht zufriedenstellende Antwort gab.
Desweiteren mögen viele Mods der Foren nicht das man alte Beiträge "wiederbelebt".
Das war mein Grundgedanke dabei.
Und zu meiner höfflichen Anfrage
Zitat:
Ein Subselect weniger aber etwas 'langsamer' als die erste und etwa gleich schnell wie die zweite von mir gepostete Abfrage.
|
Interessiert mich immernoch wie du auf 'langsamer' kommst, den dort schaltet mein
Wissenshunger und ich hoffe durch deine Antwort etwas dazu zu lernen oder dir dein
Ergebnis zu widerlegen.
Hoffe auf weitere nette Antworten
mfg
Ckaos
__________________
"Wenn die Leute Häuser so bauen würden, wie wir Programme schreiben, würde der erstbeste Specht unsere Zivilisation zerhacken."
In den allermeisten Fällen sitzt der Bug etwa 40 cm vor dem Monitor!
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 13:33:43 Uhr.
|