php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 15.04.2008, 11:41  
Erfahrener Benutzer
 
Registriert seit: 09.07.2008
Beiträge: 556
PHP-Kenntnisse:
Anfänger
SteiniKeule kann nur auf Besserung hoffen
SteiniKeule eine Nachricht über ICQ schicken SteiniKeule eine Nachricht über Skype™ schicken
Standard Abfrage mehrere Tabellen

Hallo

Ich hab hab mich schon etwas in Join eingelesen aber mir ist nicht bekannt wie ich eine abfrage schreiben könnte die mir das ganze so ausgiebt:

Tabelle1 hat z.B. ID, Name, Status, Menge
Tabelle2 ist genau so aufgebaut
gesamt ca 50 Tabellen

Jetzt will ich alle einträge die z.B. ID=2 AND Status =1 haben...

wie mache ich die abfrage??


Danke
SteiniKeule ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 15.04.2008, 12:02  
Erfahrener Benutzer
 
Benutzerbild von lazydog
 
Registriert seit: 02.04.2008
Beiträge: 4.034
lazydog befindet sich auf einem aufstrebenden Ast
Standard

Code:
SELECT
	Name,
	Menge
FROM
	tabelle1
WHERE
	id = 1
AND
	status = 1
UNION
SELECT
	Name,
	Menge
FROM
	tabelle2
WHERE
	id = 1
AND
	status = 1
__________________
Gruss
L
lazydog ist offline   Mit Zitat antworten
Alt 15.04.2008, 12:43  
Erfahrener Benutzer
 
Registriert seit: 09.07.2008
Beiträge: 556
PHP-Kenntnisse:
Anfänger
SteiniKeule kann nur auf Besserung hoffen
SteiniKeule eine Nachricht über ICQ schicken SteiniKeule eine Nachricht über Skype™ schicken
Standard

Danke für die schnelle antwort

zu dem Union fällt mir was ein das ich mal vor en paar tagen gelesen habe...

Ist es nicht so dass die Art wie UNION vorgeht etwas serverlastiger ist. vor allem bei eine hohen anzahl an Einträgen?

oder anderst gesagt... gibt es eine andere Möglichkeit die Abfrage zu gestallten die nicht so serverlastig ist?
__________________
Der Unterschied zwischen dem richtigen Wort und dem beinahe richtigen ist derselbe Unterschied wie zwischen dem Blitz und einem Glühwürmchen.
SteiniKeule ist offline   Mit Zitat antworten
Alt 15.04.2008, 13:29  
Erfahrener Benutzer
 
Benutzerbild von lazydog
 
Registriert seit: 02.04.2008
Beiträge: 4.034
lazydog befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von SteiniKeule
Ist es nicht so dass die Art wie UNION vorgeht etwas serverlastiger ist.
Serverlastiger als was? Von was für Datenmengen redest du denn? Probiers doch mal aus, wenn die Performance ungenügend ist, können wir weiter schauen, auch wenn mir im Moment nichts anderes einfällt. JOINS bringen hier gar nichts.
Aber vielleicht beschreibst du dein Problem noch etwas genauer.
__________________
Gruss
L
lazydog ist offline   Mit Zitat antworten
Alt 15.04.2008, 14:29  
Erfahrener Benutzer
 
Registriert seit: 09.07.2008
Beiträge: 556
PHP-Kenntnisse:
Anfänger
SteiniKeule kann nur auf Besserung hoffen
SteiniKeule eine Nachricht über ICQ schicken SteiniKeule eine Nachricht über Skype™ schicken
Standard

Zitat:
Zitat von lazydog
Zitat:
Zitat von SteiniKeule
Ist es nicht so dass die Art wie UNION vorgeht etwas serverlastiger ist.
Serverlastiger als was? Von was für Datenmengen redest du denn? Probiers doch mal aus, wenn die Performance ungenügend ist, können wir weiter schauen, auch wenn mir im Moment nichts anderes einfällt. JOINS bringen hier gar nichts.
Aber vielleicht beschreibst du dein Problem noch etwas genauer.
Also ich rede im moment von 750 Einträgen x 50 Tabellen. D.h. von ca 40 Einträgen. Die alle überprüft werden müssen ob sie z.B. ID=2 AND Status =1 haben... und ich will mir dann alle Treffer so ausgeben lassen

PHP-Code:
$resc2 mysql_query($resc1);
   
$produkt mysql_fetch_object($resc2);
    
echo 
'<tr><td nowrap width="140px">[url="angebot.php?resc='.$produkt->ProduktID.'"]'.$produkt->Produkt.'[/url]</td><td>'.$produkt->Menge.'</td><td>'.$produkt->EKP.'</td><td>'.$zeile->VKP.'</td><td>[url="kauf.php?resc='.$resc.'&aid='.$row->AuftragsID.'&fid='.$row->FirmenID."]kaufen[/url]</td></tr> 

Und ich hab einfach ein paar bedenken dass die Abfragen dann etwas lange dauern könnten.

Aber ich geb dir da voll rechte... Ich bedanke mich bei dir für das gute Beispiel und werde mich dann wieder an euch wenden wenn ich wirklich ein prob. habe.
SteiniKeule ist offline   Mit Zitat antworten
Alt 15.04.2008, 15:18  
Erfahrener Benutzer
 
Benutzerbild von lazydog
 
Registriert seit: 02.04.2008
Beiträge: 4.034
lazydog befindet sich auf einem aufstrebenden Ast
Standard

Da stellt sich nun mal die Frage, was diese 50 gleichen Tabellen sollen, ob man die nicht gleich in eine Tabelle schreiben kann.
Und wenn das nicht geht, ob es nicht schneller ist, eine temporäre Tabelle zu erstellen, und diese abzufragen:
PHP-Code:
<?php
$sql 
"CREATE TEMOPRARY TABLE tmp_tbl AS
        SELECT * FROM tabelle1"
;
mysql_query($sql) || die(mysql_error());
$tabls = array('tabelle2''tabelle3', ..., 'tabelle50');
foreach(
$tbls as $tbl){
    
$sql "INSERT INTO tmp_tbl(ID, Name, Status, Menge)
            SELECT  
                ID, 
                Name, 
                Status, 
                Menge
            FROM
                $tbl"
;
    
mysql_query($sql) || die(mysql_error());
}
Aber das müsste man austesten.
__________________
Gruss
L
lazydog ist offline   Mit Zitat antworten
Alt 15.04.2008, 19:08  
Erfahrener Benutzer
 
Registriert seit: 09.07.2008
Beiträge: 556
PHP-Kenntnisse:
Anfänger
SteiniKeule kann nur auf Besserung hoffen
SteiniKeule eine Nachricht über ICQ schicken SteiniKeule eine Nachricht über Skype™ schicken
Standard

Danke

Ich hab das jetzt mal versucht...

also die Seitenladezeit liegt immer so um die 0,5 sekunden.

ich habe im Moment aber auch extrem übertrieben viele Einträge.

normal kann pro abfrage nicht mehr als 50 Einträge gefunden werden. Im Moment frage ich 1200 Einträge ab. Ich werd da noch mal ein paar löschen um zu sehn wie sich das dann entwickelt.

ich hab nicht so die Ahnung... sind 0,5 viel?
SteiniKeule ist offline   Mit Zitat antworten
Alt 15.04.2008, 22:31  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 34.241
PHP-Kenntnisse:
Fortgeschritten
nikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz sein
Standard

Ich sehe auch keinen triftigen Grund, 50 Tabellen mit derselben Struktur zu verwenden. Da spricht doch nichts gegen eine gemeinsame, allenfalls mit einem zusätzlichen Feld, das mit in den Pimärschlüssel eingeht.
nikosch ist offline   Mit Zitat antworten
Alt 16.04.2008, 06:00  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Hallo,
du solltest versuchen die Tabellen zu einer zusammenzufassen und zur Unterscheidung eine neue Spalte einfuegen, zum Beispiel ENUM. Falls das nicht moeglich ist, kannst du dir entweder eine Prozedur, temporaere Tabelle oder einen VIEW erstellen. Ich persoenlich wuerde letzteres bevorzugen (aus dem Grund dass ich Prozeduren nur einsetzen wuerde wenn es nicht anders geht weil sie schwerer anzupassen sind; und temp. Tabellen weil ich damit keine Erfahrungen habe).

Du wuerdest also einmal ein Statement dieser Art erstellen:
Code:
CREATE VIEW `all_tables` AS
SELECT *, 'table_1' AS `from_table` FROM `table_1`
UNION ALL
SELECT *, 'table_2' AS `from_table` FROM `table_2`
-- UNION ALL
-- SELECT .. usw.
Einmal erstellt kannst du auf den VIEW wie auf eine normale Tabelle zugreifen:
Code:
SELECT * FROM `all_tables` WHERE `status` = 2 -- AND ..
Falls du dich dafuer entscheidest, beachte die Art der Anfuehrungszeichen!

Von schlechter Performance bei UNION habe ich noch nichts gehoert, bin dahingehend aber auch nicht belesen. Aber natuerlich lohnt es sich die Spalten nach denen du suchst zu indizieren.

Verwechsel schlechte Performance der SQL-Abfrage uebrigens nicht mit der Performance-Einbusse die die Renderengine des Browsers bei der Darstellung sehr vieler Datensaetze hervorruft.
Ich hatte bei meinem letzten "schweren Fall" mehrere tausend (10000-60000) Datensaetze, VIEWs, JOINs (insgesamt 30! in einem Query) und die Performance war trotzdem sehr akzeptabel (wenige Sekunden). Das Problem ist lediglich nur die Darstellung von ~100 Datensaetzen gleichzeitig. Fuer riesige Datenmengen ist der Browser einfach nicht das geeignete Medium.

Setz also LIMIT oder bei SQL TOP ein und du solltest zunaechst auf der sicheren Seite sein.
Zergling-new ist offline   Mit Zitat antworten
Alt 16.04.2008, 12:27  
Erfahrener Benutzer
 
Registriert seit: 09.07.2008
Beiträge: 556
PHP-Kenntnisse:
Anfänger
SteiniKeule kann nur auf Besserung hoffen
SteiniKeule eine Nachricht über ICQ schicken SteiniKeule eine Nachricht über Skype™ schicken
Standard

Ich habe aus einem ganz einfachem Grund 50 Tabellen.
Es geht hier einfach nur um die Serverbelastung.

Z.B: Die abfrage von tabelle 1 wird mind. 20 mal so oft aufgerufen wie die von allen 50 auf einmal. kleine rechnung:

SELECT * FROM tabelle1 = 750 Zeilen x20 aufrufe
SELECT * FROM alle Tabellen = 50*750 Zeilen x1 Aufruf
GESAMT (52.500 Zeilen)

Das ist eine Beispiel von 1 Benutzer. somit müsste man für 1 Benutzer 52.500 Zeilen vergleichen.

Jetzt wenn alles in einer ist:

SELECT * FROM einer Tabelle = 750*50 (37.500 ZEILEN) x21 Aufrufe (787.500 ZEILEN)

Man sieht an dem Beispiel ganz klar dass die Anzahl der Zeilen die überprüft werden oder abgerufen werden um ein vielfaches(15 faches) höher ist als bei der aktuellen Struktur. So kann ich mir sicher sein dass die am meisten aufgerufensten seiten (tabelle 1 bis tabelle 50) immer schnell geladen werden (weil nur 750 Einträge) und der Server schnelle abfragen machen kann. es ist zwar alles bischen umständlicher zu schreiben, dafür sind die häufigsten abfragen schneller.

Bitte sagt mir falls ich da irgendwo einen denkfehler habe.
SteiniKeule ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
abfrage auf gleiche Spalten aus zwei Tabellen maeck Datenbanken 13 08.07.2008 10:09
abfrage über mehrere tabellen mit einer bedingung DarkThunder PHP Tipps 2007 6 15.04.2007 17:13
Abfrage über 3 Tabellen madSoul Datenbanken 5 26.06.2006 12:25
SQL ABfrage über mehrere Tabellen Madden Datenbanken 17 09.05.2006 21:19
Abfrage mehrerer Tabellen per PHP (Code vereinfachen) PHP Tipps 2007 4 18.12.2005 12:34
[Erledigt] abfrage mehrere tabellen PHP Tipps 2005-2 3 31.10.2005 21:57
Abfrage aller Tabellen über Schleife PHP Tipps 2005-2 7 22.10.2005 12:16
problem bei ausgabe einer abfrage aus 2 Tabellen Lia PHP Tipps 2005-2 2 28.07.2005 17:30
Abfrage aus zwei Tabellen Datenbanken 1 07.06.2005 13:47
[Erledigt] MySQL Abfrage aus mehreren Tabellen Datenbanken 1 12.04.2005 17:53
Abfrage Vergleich zweier Tabellen MortakArtos Datenbanken 2 22.02.2005 16:02
Abfrage über 3 Tabellen Datenbanken 3 20.09.2004 08:08
Abfrage zweier Tabellen funzt net richtig Datenbanken 1 17.09.2004 12:53
2 Tabellen 1 Abfrage nilsfeld Datenbanken 6 11.08.2004 11:18
Abfrage über 3 Tabellen PHP Tipps 2004 3 31.07.2004 22:34

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
sql mehrere datenbank gleichzeitig abfragen, http://www.php.de/datenbanken/45794-abfrage-mehrere-tabellen.html, schnelle sql abfrage über zwei tabellen, sql abfrage aus 3 tabellen erstellen, sql zwei tabellen gleichzeitig abfragen, 3 tabellen gleichzeitig abfragen und in arrays schreiben sql, sql insert 3 tabellen auf einmal

Alle Zeitangaben in WEZ +1. Es ist jetzt 07:44 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.