Zur Navigation

SQL Anzahl Jahr gruppiert [2]

11 Jörg Kruse

Lass mal das "GROUP BY jahr" in der SQL-Abfrage weg

06.01.2010 20:00

12 uwe (Gast)

Hallo,
jetzt sieht es besser aus:
Anzahl der Datensätze: 7935
www.google.com: 366
www.rollstuhl-urlaub.de: 44
www.google.de: 4622
www.deichgedanken.de: 58
www.greuelglasmacher.com: 16
suche.t-online.de: 305
und so weiter.

Aber sollte doch sortiert nach jahr und dann aufsteigend anzeigen.

einen anderen Ansatz habe ich noch gefunden:
<?php
// Make a MySQL Connection

$query = "SELECT type, COUNT(name) FROM products GROUP BY type"; 
	 
$result = mysql_query($query) or die(mysql_error());

// Print out result
while($row = mysql_fetch_array($result)){
	echo "There are ". $row['COUNT(name)'] ." ". $row['type'] ." items.";
	echo "<br />";
}
?>
Kann man den ev. umbauen?

Gruss
Uwe

06.01.2010 22:41

13 Jörg Kruse

Aber sollte doch sortiert nach jahr und dann aufsteigend anzeigen.

Ja, das war auch nur der erste Schritt. Der zweite Schritt ist, dass du jetzt mehrere Arrays $referers aufbaust: $referers[2008], $referers[2009], $referers[2010].

Du kannst es ja mal einfach so probieren, vielleicht funktioniert das so schon:

$referers = array();

while (list($adr, $jahr) = mysql_fetch_row($adressen_query)){
    $host = getHost($adr);
    if (! isset($referers[$jahr][$host])) {
        $referers[$jahr][$host] = 1;
    } else {
        $referers[$jahr][$host] = $referers[$jahr][$host] + 1;
    }
}

Am Ende kannst du dann in einer Schleife die verschiedenen Jahre ausgeben lassen

Zu dem anderen Ansatz:
Die Gruppierung in SQL setzt denke ich voraus, dass du den Referer schon in der SQL-Abfrage in einen Host umwandeln kannst. Könnte vielleicht mit den Regex-Funktionen in MySQL gehen:

http://dev.mysql.com/doc/refman/5.1/en/regexp.html

Das ist allerdings schon etwas tricky ;)

Edit:

und dann aufsteigend anzeigen

Ja, die Arrays musst du vor der Ausgabe noch sortieren (z.B. mit asort())

07.01.2010 01:06 | geändert: 07.01.2010 01:12

14 Uwe (Gast)

Hallo,
ich versuch es noch einmal aber wieder Fehlermeldung

Gruss
Uwe

Parse error: syntax error, unexpected T_STRING in /home/www/ssssss/eeeeeeeeeeeee/abfrage.php on line 25

//Fehler hier im select
$sql = "SELECT gethost($wert) AS adresse,  SUBSTRING(monat, 1, 4) AS jahr, COUNT(*) AS Anzahl  FROM chc_referrers GROUP BY jahr, adresse  ORDER BY adresse;

$adressen_query = mysql_query($sql) or die("Anfrage nicht erfolgreich");

 

$anzahl = mysql_num_rows($adressen_query);

echo "Anzahl der Datensätze: $anzahl";
echo "<br>";

?>
<?php
function getHost($wert) {
   $parseUrl = parse_url(trim($wert));
   return trim($parseUrl[host] ? $parseUrl[host] : array_shift(explode('/', $parseUrl[path], 2)));
}

$result = mysql_query($adressen_query) or die(mysql_error());

// Print out result
while($row = mysql_fetch_array($result)){
	echo "Jahr ".  $row['jahr'] ." ". & $row['adresse'] ." Anzahl ". $row['COUNT(anzahl)'] ." Sätze.";
	echo "<br />";}
?>

08.01.2010 23:13

15 Jörg Kruse

Da fehlt ein " am Ende der SQL-Abfrage

08.01.2010 23:17

16 Uwe (Gast)

ok, das hätte ich merken müssen.

Aber die Abfrage stimmt noch nicht:

$sql = "SELECT gethost($wert) AS abt,  SUBSTRING(monat, 1, 4) AS jahr, COUNT(*) AS Anzahl  FROM chc_referrers GROUP BY jahr, abt  ORDER BY abt";

$adressen_query = mysql_query($sql) or die("Anfrage nicht erfolgreich");
Es kommt die Meldung "Anfrage nicht erfolgreich"

Gruss
Uwe

09.01.2010 07:15

17 Jörg Kruse

Du kannst dir mit "echo mysql_error();" den genauen Datenbankfehler ausgeben lassen.

Dieser liegt wahrscheinlich daran, dass es die Funktion gethost() in MySQL nicht gibt.

Es handelt sich ja um eine von dir definierte PHP-Funktion - also musst du diese auch im PHP-Code anwenden - MySQL kann damit nichts anfangen

09.01.2010 12:27 | geändert: 09.01.2010 12:28

18 Uwe (Gast)

Hallo,
jetzt muss ich passen...

Ich würde jetzt über eine Aktualisierung von einen Hilfsfeld
"Hostadresse" gehen und dann die eigentliche Abfrage durchführen

Aber wie führt man das durch?
Gruss Uwe

Ein Ansatz:

$sql = "SELECT wert FROM chc_referrers";


$adressen_query = mysql_query($sql) or die("Anfrage nicht erfolgreich");
$anzahl = mysql_num_rows($adressen_query);

echo "Anzahl der Datensätze: $anzahl";



while ($adr = mysql_fetch_array($adressen_query)){
$hostadressewert = getHost($adr['wert']); // Gives example.com

//Jetzt hier die Aktualisierung
$anfrage="UPDATE hostadresse SET hostadresse='";
 $anfrage.=$hostadressewert;
 mysql_query($anfrage);
 echo mysql_errno() . ": " . mysql_error() . "n";
 mysql_close($db);


//dann die Abfrage
$sql = "SELECT hostadresse,  SUBSTRING(monat, 1, 4) AS jahr, COUNT(*) AS Anzahl  FROM chc_referrers GROUP BY jahr, hostadresse  ORDER BY hostadresse;

$adressen_query = mysql_query($sql) or die("Anfrage nicht erfolgreich");
 

$anzahl = mysql_num_rows($adressen_query);

echo "Anzahl der Datensätze: $anzahl";
echo "<br>";

?>


$result = mysql_query($adressen_query) or die(mysql_error());

// Print out result
while($row = mysql_fetch_array($result)){
	echo "Jahr ".  $row['jahr'] ." ". & $row['hostadresse'] ." Anzahl ". $row['COUNT(anzahl)'] ." Sätze.";
	echo "<br />";}

}

function getHost($Address) {
   $parseUrl = parse_url(trim($Address));
   return trim($parseUrl[host] ? $parseUrl[host] : array_shift(explode('/', $parseUrl[path], 2)));
}
?>

10.01.2010 17:36

19 Jörg Kruse

Das sind dann ntürlich 'e Menge Update-Abfragen, die da durchgeschleift werden - und das bei jedem Aufruf dieser Statiistik

Hat mein Ansatz in der oberen Hälfte von Beitrag 13 eigentlich nicht funktioniert? damit wärst du vielleicht schon am Ziel - du müsstest die Jahres-Arreys nur noch sortieren und anschließend in Schleifen ausgeben

10.01.2010 18:30 | geändert: 10.01.2010 18:31

20 Uwe (Gast)

Hallo,
sorry, ich kann das mit dem Jahres-Arrays sortieren und anschließend in Schleifen ausgeben nicht....
Da habe ich das angefangen, was ich bisher verstehe....
Ich hatte nicht gedacht das das so schwierig ist...

Gruss
Uwe

10.01.2010 20:27