Kalle_B: GROUP BY - nur zufällig richtig?

Beitrag lesen

Hallo, Ilja,

also her damit udn dann kann dir auch geholfen werden...

Die Zeit des Seitenaufbaus zähle ich vom Beginn des Programmaufrufs bis zur vorletzten HTML-Ausgabe, die letzte Zeile ist dann die Zeitanzeige.

Es differiert etwas von Aufruf zu Aufruf, obwohl remso allein auf dem Server ist (Serverhousing, Debian-Linux, 1 Switchport 100MBit).

Hier die benötigten *Felder und die Keys:

CREATE TABLE bia\_termine (
  *id int(11) NOT NULL auto_increment,
  *owner\_id int(11) NOT NULL default '0',
  *intern\_kz int(1) NOT NULL default '0',
  *veranstalter\_id int(11) NOT NULL default '0',
  *ort\_id int(11) NOT NULL default '0',
  *tag date NOT NULL default '2001-01-01',
  *titel varchar(50) collate utf8_unicode_ci default NULL,
  *zeit\_neu int(11) default NULL,
  PRIMARY KEY  (id)
)
CREATE TABLE bia\_orte (
  *id int(11) NOT NULL auto_increment,
  *name varchar(50) collate utf8_unicode_ci NOT NULL,
  *plz varchar(10) collate utf8_unicode_ci NOT NULL,
  PRIMARY KEY  (id),
  KEY plz (plz)
)

Meine jetzige, zeitlich akzeptable Lösung (0.3 sec für die ganze Seite) hat zwei SQLs:

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

DIE LETZTEN 10 NEUERFASSUNGEN

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SELECT
 max(trm1.zeit_neu) letzte_eingabe
FROM      bia_termine trm1
WHERE     trm1.owner_id       = 1
AND       trm1.veranstalter_id > 0
AND       trm1.intern_kz = 0
GROUP BY  trm1.veranstalter_id
ORDER BY  max(trm1.zeit_neu) DESC
LIMIT 0,10

  $letzte_10 = '';  
  while ( $row_letzte_10_neu = mysql_fetch_array( $res_letzte_10_neu ))  
  {  
    $letzte_10 .= $row_letzte_10_neu['letzte_eingabe'].',';  
  }  
  $letzte_10 .= '0'; // wg. Komma  

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

DATEN ZU DEN LETZTEN 10 NEUERFASSUNGEN

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SELECT
 trm1.id            trm_id
,trm1.titel         trm_titel
,trm1.tag           trm_tag
#trm1.uhr           trm_uhr
#trm1.zeit_neu      trm_zeit_neu
#ort1.id            ort_id
,ort1.plz           ort_plz
,ort1.name          ort_name

FROM      bia_termine trm1

LEFT JOIN bia_orte ort1
ON        ort1.id = trm1.ort_id

WHERE trm1.zeit_neu IN (1238673496,1238593540,1238589841,1238571267,1238539977,1238534205,1238483656,1238410565,1238347082,1238321964,0)
ORDER BY  trm1.zeit_neu DESC

Das erste SQL hatte ich testweise als Subquery in das zweite eingesetzt. Da kam eine Fehlermeldung, die GROUP, ORDER oder LIMIT (weiss nicht mehr so genau) im Subquery nicht mochte.

Und hier zum Vergleich das alte SQL (heute morgen 7.5 sec Seitenaufbau):

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

DIE LETZTEN 10 NEUERFASSUNGEN

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SELECT
trm1.id         trm_id
,trm1.titel      trm_titel
,trm1.tag        trm_tag
,trm1.uhr        trm_uhr
,trm1.zeit_neu   trm_zeit_neu
,ort1.id         ort_id
,ort1.plz        ort_plz
,ort1.name       ort_name
FROM     ( bia_termine trm1
    ,bia_orte    ort1)
LEFT JOIN (bia_adressen adr1)
ON        (adr1.id = trm1.veranstalter_id)

WHERE     trm1.owner_id  = 1
AND       trm1.intern_kz = 0
AND       ort1.id = trm1.ort_id
AND       trm1.zeit_neu =
(
SELECT
max( trm2.zeit_neu )
FROM      bia_termine trm2
WHERE trm2.veranstalter_id = trm1.veranstalter_id
)
ORDER BY trm1.zeit_neu DESC
LIMIT  0,10

Merkwürdig ist die Zeit von 0.0001 sec, wenn ich das alte SQL im phpMyAdmin laufen lasse.

Gruß, Kalle