Archiv verlassen und diese Seite im Standarddesign anzeigen : geht das auch einfacher ??
localhost
02-04-2003, 22:25
<?
$result = mysql_query("SELECT MAX(t_id) ID FROM forum_t_cs");
$row = mysql_fetch_object($result);
$zahl1 = $row->ID;
$result = mysql_query("SELECT MAX(t_id) ID FROM forum_t_sbgost");
$row = mysql_fetch_object($result);
$zahl2 = $row->ID;
$result = mysql_query("SELECT MAX(t_id) ID FROM forum_t_sbgwest");
$row = mysql_fetch_object($result);
$zahl3 = $row->ID;
$result = mysql_query("SELECT MAX(t_id) ID FROM forum_t_sbgwest");
$row = mysql_fetch_object($result);
$zahl4 = $row->ID;
$result = mysql_query("SELECT MAX(t_id) ID FROM forum_t_community");
$row = mysql_fetch_object($result);
$zahl5 = $row->ID;
$result = mysql_query("SELECT MAX(t_id) ID FROM forum_t_nonick");
$row = mysql_fetch_object($result);
$zahl6 = $row->ID;
$result = mysql_query("SELECT MAX(t_id) ID FROM forum_t_ut");
$row = mysql_fetch_object($result);
$zahl7 = $row->ID;
$result = mysql_query("SELECT MAX(t_id) ID FROM forum_t_w3");
$row = mysql_fetch_object($result);
$zahl8 = $row->ID;
$result = mysql_query("SELECT MAX(t_id) ID FROM forum_t_bak");
$row = mysql_fetch_object($result);
$zahl9 = $row->ID;
$result = mysql_query("SELECT MAX(t_id) ID FROM forum_t_bak");
$row = mysql_fetch_object($result);
$zahl0 = $row->ID;
$result = mysql_query("SELECT MAX(t_id) ID FROM forum_t_cw");
$row = mysql_fetch_object($result);
$zahl11 = $row->ID;
echo ($zahl1+$zahl2+$zahl3+$zahl4+$zahl5+$zahl6+$zahl7+ $zahl8+$zahl9+$zahl0+$zahl11);
jwebworks
03-04-2003, 06:45
Für jetzt:
MySQL Reference Manual
3.3.4 Informationen aus einer Tabelle abfragen
http://www.mysql.com/doc/de/Retrieving_data.html
3.3.4.9 Mehr als eine Tabelle benutzen
http://www.mysql.com/doc/de/Multiple_tables.html
Für die Zukunft:
SQL für Dummies
http://www.amazon.de/exec/obidos/ASIN/3826629310/qid=1049348342/sr=2-2/ref=sr_aps_prod_2_1/028-7258712-2682915
MySQL lernen . Anfangen, anwenden, verstehen
http://www.amazon.de/exec/obidos/ASIN/3827320704/qid=1049348456/sr=1-5/ref=sr_1_2_5/028-7258712-2682915
localhost
03-04-2003, 11:23
und wo steht da wie ich das vereinfachen kann da steht auch nur das beispiel mit einer
jwebworks
03-04-2003, 12:04
siehe
3.3.4.9 Mehr als eine Tabelle benutzen
http://www.mysql.com/doc/de/Multiple_tables.html
wenn du die anzahl der ds aus mehr als einer Tabelle beziehen willst, sehe ich keinen anderen weg, als tatsächlich jede Tabelle einzeln abzufragen.
Wenn Du aber so viele gleichartige Tabellen hast, stellt sich die Frage ob da nicht ungeschickt modelliert wurde...:cool:
Wenn du deinen coede abkürzen willst bietet sich folgendes an:
$anz=0;
$tab=arry("tabelle1","tabelle2","tabelle3");
for($i=0;$i<count($tab);$i++) {
$sql="select count(*) as id from ".$tab[$i];
$row = mysql_fetch_object($sql);
$anz=$anz+$row->ID;
}
echo $anz;
immer wenn eine neue Tabelle dazukommt erweiterst du das array $tab ;)
jwebworks
03-04-2003, 14:40
OK, dann ganz von vorne:
Wenn ich
SELECT MAX(id) FROM artikel
ausführe gibt MAX mir den größten
Wert zurück.
In den Links steht oben ganz klar drin,
wie man das mit mehreren tabellen macht:
SELECT MAX(artikel.id), MAX(news.id) FROM artikel, news
eine einzige Abfrage und ein bisschen gelesen.
cu, stop.h
sorry, nicht count(*) sondern max(..)
das funct natürlich:
SELECT MAX(artikel.id), MAX(news.id) FROM artikel, news
Das Problem im DB-Design bleibt aber dennoch. Bei dieser Abfrage erzegst du einen cross-join, und damit je nach grösse und anzahl der Tabellen eine serverlast, die die kiste mindestens ausbremst wenn nicht sogar umhaut...;)
darum ist es besser die tabellen einzeln abzufragen:
select max(feld) from tab1;
select max(feld) from tab2;
usw.
jwebworks
03-04-2003, 15:10
Hmm. Das wäre einmal auszuprobieren.
30 Tabellen + 300000 Einträge pro Tabelle und
beide Möglichkeiten ausprobieren.
Ich glaube, dass das ganze, wenn Du es auf ein
Feld (mit Index) anwendest MySQL da relativ
locker mit umgehen sollte.
Dass man keine 10 Tabellen identischen Inhalts,
die sich nur durch den Namen unterscheiden
(forum1, forum2), anlegt ist klar. Das verstößt
ganz klar gegen mindestens 10000 Normalformen
;-)
cu, stop.h
hmmm, wenn ich richtig liege wären das
300000 hoch 30 ergebniszeilen aus denen mysql die 30 maximalwerte heraussuchen soll...
ok, du testest . willst du ein perlscript, das die daten erzeugt ?
jwebworks
03-04-2003, 15:15
OK, ich mache mich mal drüber :-)
Mir ist nochwas eingefallen.
Er gibt oben doch die Ergebnisse zusammenhängend
mit echo aus. Wie klingt denn folgende Abfrage?
:D
select CONCAT(MAX(news.id), MAX(spieler.id)) from news, spieler
sehr hübsch die abfrage, aber concat hängt die sachen nur aneinander, ist nicht eher
select max(id1)+max(id2) from ....
gemeint ?
das script erzeugt die daten.
aufruf: ./mysqltest.pl |mysql
auf meiner kiste wird die db gerade mit daten befüllt...:D
ups, hier das script, ich statt 30.000 nur 3.000 DS pro tabelle genommen...
@jwebworks, aber hallo,
nenn mich klugscheisser.... es funxt problemlos. da strecht doch einigermassen intelligenz in der db...:eek:
select max(t1.id), max(t2.id), max(t3.id), max(t4.id), max(t5.id), max(t6.id), max(t7.id), max(t8.id), max(t9.id), max(t10.id), max(t11.id), max(t12.id), max(t13.id), max(t14.id), max(t15.id), max(t16.id), max(t17.id), max(t18.id), max(t19.id), max(t20.id), max(t21.id), max(t22.id), max(t23.id), max(t24.id), max(t25.id), max(t26.id), max(t27.id), max(t28.id), max(t29.id), max(t30.id) from tab_1 t1, tab_2 t2, tab_3 t3, tab_4 t4, tab_5 t5, tab_6 t6, tab_7 t7, tab_8 t8, tab_9 t9, tab_10 t10, tab_11 t11, tab_12 t12, tab_13 t13, tab_14 t14, tab_15 t15, tab_16 t16, tab_17 t17, tab_18 t18, tab_19 t19, tab_20 t20, tab_21 t21, tab_22 t22, tab_23 t23, tab_24 t24, tab_25 t25, tab_26 t26, tab_27 t27, tab_28 t28, tab_29 t29, tab_30 t30;
jwebworks
03-04-2003, 20:10
OK ich habe jetzt meine Tests auch fertig. :-)
Hatte noch zu tun.
Tabellen 30 / Einträge 30000
Laufzeit mit microtime gemessen.
Rechner: AthlonXP 2100+
OS: gentoo Linux
MySQL: 4.0.12
PHP: 4.3.1
Tabelle mit PRIMARY_KEY:
30 einzelne Abfragen: 0.00604
1 Abfrage: 0.002842
Tabelle ohne PRIMARY_KEY:
(wegen Laufzeit mit der Cli-Version von php)
30 einzelne Abfragen: 0.618854
1 Abfrage: > 6 Minuten (MySQLd-Last 100%)
Der Test ist aber nicht so ganz realistisch, weil
die Einträge alle der Reihe nach drinstehen.
AUTOINCREMENT kann bei der MAX-Funktion
einen starken Ausschlag geben.
Hehe, aber wir hatten beide Recht.
Scripts gibts im Anhang.
cu, stop.h
jwebworks
03-04-2003, 20:25
Hoppla, dabei fällt mir auf, dass im Hintergrund
tetex kompiliert hat ;-) das hatte ich ganz
vergessen. :D
Die Zeiten dürften trotzdem passen, da MySQL
für die Abfrage bestimmt nicht die Daten an-
fassen musste, sondern nur den Index.
cu, stop.h
ich habe gesteren abend noch mein script angeworfen und die Tabellen mit je 300.000 DS befüllt. ich habe latürnich auch den pk gesetzt. die abfrage kommt in der Ausführungszeit auf ein ähnlich beeindruckendes ergebnis:
(gemessen dat mysql selbst...)
1. Ausführung: 3,2 s
2. Ausführung: 0,6 s
Hut ab vor der Leistung :D
Womit mal wieder bewiesen sein sollte, dass MySQL trotz beschränktem Sprach und Funktionsumfang kein schlechtes DBMS ist.
mysql ist in diesem fall wie meine frau: beide scaffen es mich nach jahren der zweisamkeit doch immer noch -positiv- zu überraschen :D
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.