SELFPHP: Version 5.8.2 Befehlsreferenz - Tutorial – Kochbuch – Forum für PHP Einsteiger und professionelle Entwickler

SELFPHP


Professional CronJob-Service

Suche



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



:: Buchempfehlung ::

Webseiten professionell erstellen

Webseiten professionell erstellen zur Buchempfehlung
 

:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 

Zurück   PHP Forum > SELFPHP > MySQLi/PDO/(MySQL)
Hilfe Community Kalender Heutige Beiträge Suchen

MySQLi/PDO/(MySQL) Anfänger, Fortgeschrittene oder Experten können hier Fragen und Probleme rund um MySQLi/PDO/(MySQL) diskutieren

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 24.11.2004, 00:37:49
bazubi bazubi ist offline
Junior Member
 
Registriert seit: Jan 2004
Beiträge: 496
Abfrage optimieren

Hallo,

ich würde gerne folgenden Quellcode optimieren:

PHP-Code:

 
//getting all systems and assigning them to a smarty value
$query = @mysql_query('SELECT o.id AS id, o.ip AS ip, o.tme AS tme, s.name AS name FROM onlinestate AS o, systems AS s WHERE o.id = s.id ORDER BY o.tme DESC');

$data = array();
$ids  = array();
while (
$arr = @mysql_fetch_assoc($query)) {
            if (! 
in_array($arr['id'], $ids)) {
                
$data[] = $arr;
                
$ids[]  = $arr['id'];
            }
        } 
Der Quellcode soll folgendes tun: Aus der Tabelle "onlinestate" sollen alle Datensätze ausgelesen werden. Innerhalb dieser Tabelle wird jeder Zeitpunkt eines Seitenaufrufs gespeichert. Der Name der Seite soll aus der Tabelle "systems" gelesen werden. Allerdings will ich jetzt nicht alle Datensätze aus "onlinestate" sondern nur den letzten Zeitpunkt pro Seite. Das macht im Moment die if (! in_array(...)) Abfrage. Kann man diese if Verzweigung noch irgendwie umgehen, in dem man den SQL Befehl verändert?
Mit Zitat antworten
  #2  
Alt 24.11.2004, 08:32:36
c4 c4 ist offline
SELFPHP Guru
 
Registriert seit: Jul 2002
Ort: Oberursel
Alter: 54
Beiträge: 4.748
Ich habe auf meiner Seite auch eine kleine Seitenaufrufstatistik (sic!):
--> http://dbCF.de/hits-per-page/

Würde ich hier die letzten Zugriffe wissen wollen, dann würde das so aussehen:
Code:
SELECT dbcf_hits_per_page.id, title, MAX(last_time)
FROM dbcf_hits_per_page INNER JOIN dbcf_hits_per_page_ips ON dbcf_hits_per_page.id=dbcf_hits_per_page_ips.id
GROUP BY dbcf_hits_per_page.id
Die Ausgabe sieht dann wie folgt aus:
Code:
id  title                                       MAX(last_time)
1   Hintergrundbilder                           1101280576
3   Start                                       1101279977
12  14895 EDV Abkürzungen und ihre Wortlaute    1101280493
38  ColorFader mit PHP                          1101280996
Da bei mir alte Einträge gelöscht werden, variiert diese Anzeige ständig, klar.

Deine Abfrage würde also ungefähr so aussehen:
Code:
SELECT o.id, o.ip, o.tme, s.name
FROM onlinestate INNER JOIN systems ON onlinestate.id=systems.id
ORDER BY o.tme DESC
Das mit dem AS bla kannst Du Dir sparen, solange Du nicht o.id und s.id rausholst.

Alles klarofix?
__________________
sic!
--> http://dbCF.de/
Mit Zitat antworten
  #3  
Alt 24.11.2004, 09:30:44
bazubi bazubi ist offline
Junior Member
 
Registriert seit: Jan 2004
Beiträge: 496
Danke für die Antwort.

Einen Inner Join hatte ich ja praktisch schon mit dem where s.id = o.id. Das funktioniert auch soweit. Deine Abfrage (die zweite) macht im Ergebniss die gleiche wie meine. Ich bekomme dann ungefähr die folgende Ergebnisstabelle:

Code:
id    ip       tme       name
------------------------------------
1     xyz      1008000   seite1
1     xyz      1007000   seite1
2     xyz      1006000   seite2
1     xyz      1005000   seite1
3     xyz      1004000   seite3
2     xyz      1003000   seite2
D.h. ich bekomme jeden Hit für jede Seite. Ich will aber pro Seite nur den letzten Hit. Es soll also so ausehen:

Code:
id    ip       tme       name
------------------------------------
1     xyz      1008000   seite1
2     xyz      1006000   seite2
3     xyz      1004000   seite3
(Die IP ist im Prinzip unwichtig es könnten also auch verschiedene IPs sein)

Ich habe zwischenzeitlich auch nochmal versucht ein MAX() mit einzubauen, erhalte aber bei der Abfrage:

Code:
 SELECT o.id, o.ip, MAX( o.tme ) AS tme, s.name
FROM onlinestate AS o, systems AS s
WHERE o.id = s.id
nur die Fehlermeldung

Code:
#1140 - Mixing of GROUP columns (MIN(),MAX(),COUNT()...) with no GROUP columns is illegal if there is no GROUP BY clause

Geändert von bazubi (24.11.2004 um 09:35:08 Uhr)
Mit Zitat antworten
  #4  
Alt 24.11.2004, 09:38:29
c4 c4 ist offline
SELFPHP Guru
 
Registriert seit: Jul 2002
Ort: Oberursel
Alter: 54
Beiträge: 4.748
Hatte ganz vergessen MAX() in Deine Abfrage einzubinden.

Versuchen wir es mal damit:
Code:
SELECT o.id, MAX(o.tme) tme, s.name
FROM onlinestate o INNER JOIN systems s ON o.id=s.id
GROUP BY s.id
ORDER BY s.name
Wenn auch das nicht klappt, dann solltest Du Dich lieber selber damit beschäftigen (Doku MySQL). Für mich ist das ohne Daten schlecht testbar.
__________________
sic!
--> http://dbCF.de/
Mit Zitat antworten
  #5  
Alt 24.11.2004, 09:51:03
bazubi bazubi ist offline
Junior Member
 
Registriert seit: Jan 2004
Beiträge: 496
Danke, jetzt klappt es bestens. Mit GROUP BY hatte ich es schonmal versucht, allerdings hatte ich da keinen INNER JOIN sondern nur ein WHERE. Das in Verbindung mit einem ORDER BY hat sich gebissen.

Ich werde es mir dick hinter die Ohren schreiben. Bei 2 Tabellen nur noch JOINs und keine WHEREs mehr! ;)
Mit Zitat antworten
Antwort


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.

BB-Code ist an.
Smileys sind aus.
[IMG] Code ist aus.
HTML-Code ist aus.

Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 02:31:04 Uhr.


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


© 2001-2024 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt