php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 03.09.2010, 10:58  
Neuer Benutzer
 
Registriert seit: 24.08.2010
Beiträge: 21
PHP-Kenntnisse:
Anfänger
HiddenX befindet sich auf einem aufstrebenden Ast
Standard

Ich schon wieder

Also rein logich betrachtet muss es mit dem JOIN über 3 Tabellen schneller gehen. Eine Abfrage und danach eine Schleife MUSS schneller sein als eine Schleife mit vielen DB-Abfragen drin.

Also habe ich jetzt mal versucht:

Code:
SELECT inventuren.jahr,
  filialen.nr,
  filialen.filiale,
  SUM(`BewPreis3`)AS SUMME1,
  SUM(`Menge-Diff`) AS SUMME2,
  umsatz  
FROM filialen
LEFT JOIN umsatz ON filialen.nr = umsatz.nr
LEFT JOIN inventuren ON filialen.nr = inventuren.nr
group by filialen.nr, jahr
order by nr, jahr
Ergebnis:
inventuren.jahr - OK, es werden alle Jahre aufgelistet, von 2007 bis 2010
filialen.nr - OK, alle Filialnummern sind da, immer 4* (2007-2010)
filialen.filiale - OK, entsprechend der nr
SUMME1 - Hier fängt das Elend an: Der ausgegebene Wert ist im ersten Block, also bei den ersten 2007-2010, 3*Wert des ersten Datensatzes (sooft es bei der Filiale umsätze gibt), beim zweiten Mal korrekt.
SUMME2 - Analog zu Summe2

Beim zweiten Block, also beim zweiten Mal 2007-2010 stimmt alles. Vermutlich aber nur deshalb, weil ich bei der zweiten Filiale testhalber nur einen Umsatz drin habe. Ich vermute, dass bei zwei Umsätzen Summe1 der doppelte Wert des ersten Datensatz wäre.

Ich habe testweise mal den dritten JOIN rausgenommen, also nur Filialen und deren Umsätze- das geht.

Hat jemand einen Tipp für mich?
HiddenX ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 04.09.2010, 12:45  
Erfahrener Benutzer
 
Registriert seit: 03.09.2009
Beiträge: 158
PHP-Kenntnisse:
Anfänger
kn0wledge befindet sich auf einem aufstrebenden Ast
Standard

Irgendwie ist dein Tabellen Design komisch
PHP-Code:
LEFT JOIN umsatz ON filialen.nr umsatz.nr
LEFT JOIN inventuren ON filialen
.nr inventuren.nr 
sowas finde ich nicht logisch.

so in der Richtung fände ich das viel logischer
PHP-Code:
LEFT JOIN umsatz ON filialen.nr umsatz.filialen_nr
LEFT JOIN inventuren ON filialen
.nr inventuren.filialen_nr 
kn0wledge ist offline   Mit Zitat antworten
Alt 06.09.2010, 11:18  
Neuer Benutzer
 
Registriert seit: 24.08.2010
Beiträge: 21
PHP-Kenntnisse:
Anfänger
HiddenX befindet sich auf einem aufstrebenden Ast
Standard

Das sieht in der Tat übersichtlicher aus, ändert aber nichts am Grundproblem
HiddenX ist offline   Mit Zitat antworten
Alt 06.09.2010, 20:47  
Erfahrener Benutzer
 
Benutzerbild von Delirius
 
Registriert seit: 07.07.2009
Beiträge: 188
PHP-Kenntnisse:
Anfänger
Delirius wird schon bald berühmt werden
Standard

Zitat:
SUMME1 - Hier fängt das Elend an: Der ausgegebene Wert ist im ersten Block, also bei den ersten 2007-2010, 3*Wert des ersten Datensatzes (sooft es bei der Filiale umsätze gibt), beim zweiten Mal korrekt.
Ok...der Datensatz wird 3mal ausgegeben, also muss er in Verbindung mit deinen join´s ja mehrfach gezählt werden.
Zitat:
Ich habe testweise mal den dritten JOIN rausgenommen, also nur Filialen und deren Umsätze- das
Das würde dann meine These bestätigen.
Code:
group by filialen.nr, jahr
order by nr, jahr
Dann versuch´ mal an der Stelle noch eine weitere Gruppierung hinzuzufügen --> inventuren.nr.

Wenn ich gerade völlig daneben liege, entschuldige ich mich bereits jetzt

Geändert von Delirius (06.09.2010 um 20:48 Uhr). Grund: Schreibfehler
Delirius ist offline   Mit Zitat antworten
Alt 14.09.2010, 20:00  
erc
Erfahrener Benutzer
 
Registriert seit: 02.01.2009
Beiträge: 730
PHP-Kenntnisse:
Fortgeschritten
erc wird schon bald berühmt werden
Standard

Zitat:
Zitat von Wolla Beitrag anzeigen
SELECT ...
FROM tabelle1,tabelle2

bildest du im Speicher ein karthesisches Produkt der Tabellen.
Das ist Quatsch... mach ein EXPLAIN, schaus dir im QueryAnalyzer, SET PLANONLY oder k.a.. Jedes gängige RDBMS ist in der lage solche JOINs mithilfe der WHERE Bedingung sinnvoll zu lösen.

Zitat:
Zitat von HiddenX Beitrag anzeigen
Code:
SELECT inventuren.jahr,
  filialen.nr,
  filialen.filiale,
  SUM(`BewPreis3`)AS SUMME1,
  SUM(`Menge-Diff`) AS SUMME2,
  umsatz  
FROM filialen
LEFT JOIN umsatz ON filialen.nr = umsatz.nr
LEFT JOIN inventuren ON filialen.nr = inventuren.nr
group by filialen.nr, jahr
order by nr, jahr
Hat jemand einen Tipp für mich?
Die Tabelle umsatz und inventuren sind voneinander ZEITLICH abhängig. Diese Abhängigkeit muss in die JOIN Bedingung.


z.B.:

Code:
SELECT inventuren.jahr,
  filialen.nr,
  filialen.filiale,
  SUM(`BewPreis3`)AS SUMME1,
  SUM(`Menge-Diff`) AS SUMME2,
  umsatz  
FROM filialen
LEFT JOIN umsatz ON filialen.nr = umsatz.nr
LEFT JOIN inventuren ON filialen.nr = inventuren.nr AND umsatz.zeitraum = inventuren.zeitraum
group by filialen.nr, jahr
order by nr, jahr

Geändert von erc (14.09.2010 um 20:54 Uhr).
erc ist offline   Mit Zitat antworten
Alt 14.09.2010, 20:16  
Moderator
 
Registriert seit: 06.06.2008
Beiträge: 4.849
PHP-Kenntnisse:
Fortgeschritten
Wolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer Anblick
Wolla eine Nachricht über ICQ schicken
Standard

http://dev.mysql.com/doc/refman/5.1/de/join.html

Zitat:
INNER JOIN und , (Komma) sind semantisch gleichwertig, wenn keine Join-Bedingung vorhanden ist: Beide erzeugen ein kartesisches Produkt zwischen den angegebenen Tabellen (d. h., jeder Datensatz in der ersten Tabelle wird mit jedem Datensatz in der zweiten Tabelle verknüpft).
Hab ich das falsch verstanden?
__________________
Warum denkt mein Hund eigentlich immer dann, wenn es an der Tür klingelt, es sei für ihn?
Wolla ist offline   Mit Zitat antworten
Alt 14.09.2010, 20:22  
Moderator¹
 
Registriert seit: 28.03.2010
Beiträge: 7.470
PHP-Kenntnisse:
Fortgeschritten
ChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer Anblick
Standard

Durch das
Code:
WHERE tabelle1.spalte = tabelle2.spalte
ist eine JOIN-Bedingung vorhanden - das ist äquivalent zur ON-Klausel im expliziten JOIN.
__________________
RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
ChrisB ist offline   Mit Zitat antworten
Alt 14.09.2010, 21:41  
Moderator
 
Registriert seit: 06.06.2008
Beiträge: 4.849
PHP-Kenntnisse:
Fortgeschritten
Wolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer Anblick
Wolla eine Nachricht über ICQ schicken
Standard

Das wird wohl in manchen Beschreibungen missverständlich dargestellt.

Hier ein anderes Tutorial:

http://www.sqldocu.com/four/join.htm
Zitat:
SELECT T1.name, T2.name FROM captain T1, raumschiff T2
WHERE T1.nr_schiff = T2.nr_schiff

SELECT T1.name, T2.name FROM captain T1 INNER JOIN raumschiff T2
ON T1.nr_schiff = T2.nr_schiff

Beide Abfragen liefern das selbe Ergebnis. In der ersten Zeile der SQL Abfragen wird das kartesische Produkt (siehe Beschreibung) gebildet (besteht aus 25 Reihen). In der zweiten Zeile filtern wir durch die WHERE/ON Bedingung die gewünschten Zeilen aus dem kartesischen Produkt heraus.

Ich habe mit der Komma-Syntax und zwei Tabellen mit 14 Mio Zeilen und 3 Mio Zeilen den Join über zwei indexierte Spalten nach einem Timeout gekillt. In der Konsole konnte man sehen, dass das nach 1 Stunde noch lief. Mit LEFT JOIN kam das Ergebnis nach 20 sec.

Also irgendwas muss da schon anders laufen.
__________________
Warum denkt mein Hund eigentlich immer dann, wenn es an der Tür klingelt, es sei für ihn?
Wolla ist offline   Mit Zitat antworten
Alt 15.09.2010, 17:26  
erc
Erfahrener Benutzer
 
Registriert seit: 02.01.2009
Beiträge: 730
PHP-Kenntnisse:
Fortgeschritten
erc wird schon bald berühmt werden
Standard

Zitat:
Zitat von Wolla Beitrag anzeigen
Ich habe mit der Komma-Syntax und zwei Tabellen mit 14 Mio Zeilen und 3 Mio Zeilen den Join über zwei indexierte Spalten nach einem Timeout gekillt. In der Konsole konnte man sehen, dass das nach 1 Stunde noch lief. Mit LEFT JOIN kam das Ergebnis nach 20 sec.

Also irgendwas muss da schon anders laufen.
Mach ein EXPLAIN und schau was die Datenbank macht...
erc 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 von einer Abfrage Datenbanken 5 27.01.2011 23:31
Problem mit Abfrage - join, inner join, distinct? Gachet01 Datenbanken 2 27.01.2011 06:49
Optimierung einer Abfrage eines Datensatzes samt Vorgänger und Nachfolger Sirke Datenbanken 7 28.04.2010 17:11
result Variablen von SQL verbinden vci PHP Tipps 2010 15 05.02.2010 19:09
Scriptsuche [Erledigt] SQL- Abfrage über 2 tabellen ejim Scriptbörse 1 17.07.2009 21:10
SQL Abfrage ohne DESC langsam Thisi Datenbanken 5 07.01.2009 09:53
Wiemache ich eine Abfrage über 3 Tabellen??? djscaleo Datenbanken 8 05.01.2009 10:46
MySQL - Fehler in einfacher Abfrage oden Datenbanken 11 03.01.2009 20:03
SELECT WHERE datetime abfrage - Optimierung mrSpok Datenbanken 15 23.03.2006 19:08
mysql abfrage über 4 Tabelle - bis 3 geht, bei der 4. habert Datenbanken 2 08.09.2005 11:59
[Erledigt] IF() abfrage in variable packen PHP Tipps 2005 14 01.04.2005 17:23
Abfrage von Char-Feldern Datenbanken 9 04.02.2005 14:06
[Erledigt] Mysql Abfrage Problem! PHP-Fortgeschrittene 5 27.11.2004 10:22
Abfrage funktioniert zwar, aber nicht korrekt Datenbanken 2 16.08.2004 09:10
Abfrage aus DB noch mal ausgeben und Abfrage aus mehrern Tab PHP Tipps 2004 4 12.07.2004 15:00

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
inventur optimierung themen, filialen nr, http://www.php.de/datenbanken/71396-optimierung-einer-abfrage-2.html

Alle Zeitangaben in WEZ +1. Es ist jetzt 05:38 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