php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > SQL / Datenbanken
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden.

Antwort
 
LinkBack Themen-Optionen Bewertung: Bewertung: 1 Stimmen, 4,00 durchschnittlich.
  #16 (permalink)  
Alt 19-11-2009, 13:00
DerEsWissenWill
 Registrierter Benutzer
Links : Onlinestatus : DerEsWissenWill ist offline
Registriert seit: Feb 2003
Beiträge: 61
DerEsWissenWill ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ich hab's. Missverständnis. Es gibt in jedem Fall mindestens einen Datensatz zu Tabelle 1 (hab mich wohl blöd ausgedrückt mit dem eventuell, das sollte heiußen eventuell mehrere).

Das Problem bei Deiner Variante

PHP-Code:
select sum(distinct t1.number) - sum(ifnull(t2.number0))
from t1
left join t2 using 
(id
ist halt, dass mir das noch immer nicht die Gesamtsumme liefert, sondern wieder mehrere Zeilen, eben 1 für jede id in Tabelle 1. Und ich will ja die Gesamtsumme der einzelnen (zeilenweisen) Teilsummen aus 1.number - t2.number.
Mit Zitat antworten
  #17 (permalink)  
Alt 19-11-2009, 13:03
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
Zitat von DerEsWissenWill Beitrag anzeigen
Das Problem bei Deiner Variante

PHP-Code:
select sum(distinct t1.number) - sum(ifnull(t2.number0))
from t1
left join t2 using 
(id
ist halt, dass mir das noch immer nicht die Gesamtsumme liefert, sondern wieder mehrere Zeilen, eben 1 für jede id in Tabelle 1. Und ich will ja die Gesamtsumme der einzelnen (zeilenweisen) Teilsummen aus 1.number - t2.number.
Nein, das liefert nur eine Zeile (siehe meinen Testcode ganz unten). Hast du es etwa mit group by abgesetzt? Da darf kein group by mehr rein, du musst es so abschicken, wie es ist.
Mit Zitat antworten
  #18 (permalink)  
Alt 19-11-2009, 13:34
DerEsWissenWill
 Registrierter Benutzer
Links : Onlinestatus : DerEsWissenWill ist offline
Registriert seit: Feb 2003
Beiträge: 61
DerEsWissenWill ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Dann geht das Select, liefert aber anderes Ergebnis. Also, wenn ich die Ergebniszeilen aus

PHP-Code:
select
t1
.number sum(ifnull(t2.number0)) as return
from t1 
left join t2 using 
(id)
group by id
having 
return > 
addiere, kriege ich nicht das Ergebnis, das mir

PHP-Code:
select
sum
(distinct t1.number) - sum(ifnull(t2.number0)) 
from t1 
left join t2 using 
(id
liefert.
Mit Zitat antworten
  #19 (permalink)  
Alt 20-11-2009, 01:50
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Ändert sich das Ergebnis, wenn du bei deiner Variante "group by t1.id" statt "group by id" verwendest? Hast du die Spalte t2.id wirklich mit einem Index und einem InnoDB-Fremdschlüsselconstraint versehen? Kannst du evtl. mal die relevanten Create-Table-Statements posten?

Ansonsten erläutere bitte mal, inwiefern sich dein System von meinem Testsetting unterscheidet.
Mit Zitat antworten
  #20 (permalink)  
Alt 20-11-2009, 08:03
DerEsWissenWill
 Registrierter Benutzer
Links : Onlinestatus : DerEsWissenWill ist offline
Registriert seit: Feb 2003
Beiträge: 61
DerEsWissenWill ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Also, zu 1: Das Ergebnis ändert sich nicht. Ich verwende dennoch ein t1.id, ist ja auch richtig, oder?

Zu 2: Klar, da ist ein Index drauf. Was ist denn ein "InnoDB-Fremdschlüsselconstraint"?? Die Tabelle ist übrigens MyISAM.

Weitere Unterscheidungen wüsste ich auch nicht. Hier mal die Creates:

PHP-Code:
CREATE TABLE `orderinflow` (
    `
id_orderinflowINT(11UNSIGNED NOT NULL AUTO_INCREMENT,
    `
salesvolumeDECIMAL(7,2UNSIGNED NOT NULL DEFAULT '0.00',
    
PRIMARY KEY (`id_orderinflow`),
    
INDEX `salesvolume` (`salesvolume`)
)
COLLATE=utf8_general_ci
ENGINE
=MyISAM
ROW_FORMAT
=DYNAMIC

CREATE TABLE 
`orderinflow2invoice` (
    `
idINT(11UNSIGNED NOT NULL AUTO_INCREMENT,
    `
id_orderinflowINT(11UNSIGNED NOT NULL DEFAULT '0',
    `
salesvolume_invoicedDECIMAL(7,2UNSIGNED NOT NULL DEFAULT '0.00',
    
PRIMARY KEY (`id`),
    
INDEX `id_orderinflow` (`id_orderinflow`),
    
INDEX `salesvolume_invoiced` (`salesvolume_invoiced`)
)
COLLATE=utf8_general_ci
ENGINE
=MyISAM
ROW_FORMAT
=FIXED 
Das sind jetzt nur die relavanten Felder, die anderen habe ich weggelassen.
Mit Zitat antworten
  #21 (permalink)  
Alt 20-11-2009, 10:45
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Hallo,

ich vermute, du bekommst unterschiedliche Ergebnisse, weil bei dir durch den fehlenden Constraint irgend wann mal die referentielle Integrität flöten gegangen ist. InnoDB ist die Engine, mit der man echte Fremdschlüsselbeziehungen abbilden kann, die dann auch überprüft werden.

Gruß,

Amica
Mit Zitat antworten
  #22 (permalink)  
Alt 21-11-2009, 08:24
DerEsWissenWill
 Registrierter Benutzer
Links : Onlinestatus : DerEsWissenWill ist offline
Registriert seit: Feb 2003
Beiträge: 61
DerEsWissenWill ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Also, ich glaube nicht, dass es an der Datenbank liegt. Warum geht dann die andere Abfrage? Ich glaube eher, dass die Abfrage

PHP-Code:
select 
sum
(distinct t1.number) - sum(ifnull(t2.number0))  
from t1  
left join t2 using 
(id
falsch ist. Schließlich dürfte das distinct.number doppelte Werte in der Spalte number rausschmeißen. Das ist aber nicht korrekt, denn dort können natürlich mehrfach gleiche Werte vorkommen. Oder sehe ich das falsch?
Mit Zitat antworten
  #23 (permalink)  
Alt 21-11-2009, 08:48
DerEsWissenWill
 Registrierter Benutzer
Links : Onlinestatus : DerEsWissenWill ist offline
Registriert seit: Feb 2003
Beiträge: 61
DerEsWissenWill ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ok, wenn ich es so mache, dann geht es:

PHP-Code:
select  
sum
(t1.number) - sum(ifnull(t2.number0))   
from t1   
left join t2 using 
(id
Also ich bekomme das richtige Ergebnis. Aber ich wüsste auch gern, bei wievielen Datensätzen diese Differenz > 0 ist. Ich würde also gern sowas in dieser Art machen:

PHP-Code:
select
count
(id),  
sum(t1.number) - sum(ifnull(t2.number0)) as result
from t1   
left join t2 using 
(id)
HAVING result 
dann liefert mir aber das count(id) die Gesamtzahl der Datensätze. Also brauche ich wieder GROUP BY, oder? Und dann bin ich wieder da wo ich am Anfang herkam. Ich kriege dann nämlich wieder mehrere Zeilen und nicht nur eine mit der Gesamtsume. Kann ich bei dem count() irgendwas anderes nutzen?
Mit Zitat antworten
  #24 (permalink)  
Alt 21-11-2009, 09:13
DerEsWissenWill
 Registrierter Benutzer
Links : Onlinestatus : DerEsWissenWill ist offline
Registriert seit: Feb 2003
Beiträge: 61
DerEsWissenWill ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Und noch was. Warum macht denn das

PHP-Code:
select   
sum
(t1.number) - sum(ifnull(t2.number0))    
from t1    
left join t2 using 
(id
und das

PHP-Code:
select   
t1
.number sum(ifnull(t2.number0))    
from t1    
left join t2 using 
(id
ein anderes Ergebnis? t1.number ist doch immer das gleiche Feld und die Summe aus dem einen Feld gibt doch das gleiche Ergebnis?!?
Mit Zitat antworten
  #25 (permalink)  
Alt 21-11-2009, 11:49
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Das erste Statement kann nur Blödsinn liefern, weil es die Summe aller im Kreuzprodukt vorhandener Rows von t1 bildet, also auch doppelte und dreifache mit summiert.

Code:
select   
sum(distinct t1.number) - sum(ifnull(t2.number, 0))    
from t1    
left join t2 using (id)
dagegen summiert jede Row aus t1 nur einmal und daher gibt dieses Statement die Summe aller t1-Rows abzüglich der Summe aller t2-Rows zurück, also das was du ursprünglich mal wolltest. Du hast zwar gefordert, dass t2 dann jeweils zu t1 gehören muss, aber diese Forderung ist wegen des Kommutativgesetzes tautologisch.

Das zweite Statement liefert in genau dieser Form auch nur Blödsinn, weil es keine group-by-Klausel hat. Dadurch wird ein beliebiger Datensatz aus t1 herangezogen und von dessen Wert die Summe der number-Felder der assoziierten t2-Rows abgezogen. Mit einer "group by t1.id"-Klausel dagegen liefert das zwar deine gewünschten Zwischenergebnisse, aber für jedes t1 einzeln und nicht die Gesamtsumme, wie du ja gefordert hast. Das Statement mit group by wäre also korrekt, müsste aber mit while durchiteriert und subsummiert werden.
Mit Zitat antworten
  #26 (permalink)  
Alt 21-11-2009, 12:11
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
Zitat von DerEsWissenWill Beitrag anzeigen
Schließlich dürfte das distinct.number doppelte Werte in der Spalte number rausschmeißen. Das ist aber nicht korrekt, denn dort können natürlich mehrfach gleiche Werte vorkommen. Oder sehe ich das falsch?
Diesen Beitrag hatte ich erst übersehen und nur deinen letzten beantwortet. Jetzt haben wir auch den Unterschied zu meinem Testsetting gefunden: Ich hatte für t1.number immer eindeutige Testwerte, du hast echte Livedaten, wo natürlich auch zufällig mal was doppelt ist.

Dein Einwand hinsichtlich distinct ist also korrekt, da sich distinct in diesem Falle ja nur auf t1.number stürzen kann und nicht den ganzen Datensatz auf Eindeutigkeit prüfen kann.

Experimente mit
Code:
sum(distinct concat(t1.number, '@', t1.id))
liefen auf das gleiche hinaus.

Ich geb mich also geschlagen.
Mit Zitat antworten
  #27 (permalink)  
Alt 21-11-2009, 12:16
DerEsWissenWill
 Registrierter Benutzer
Links : Onlinestatus : DerEsWissenWill ist offline
Registriert seit: Feb 2003
Beiträge: 61
DerEsWissenWill ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ok, das heißt jetzt also, dass es tatsächlich keine Möglichkeit gibt, aus meiner funktionierenden Abfrage mit GROUP BY die Einzelsummen zu addieren UND mir zu sagen, wieviele solcher Datensätze es gibt? Ich kann mir das irgendwie gar nicht vorstellen, dass das nicht geht... Also dann nur mir Subselect?
Mit Zitat antworten
  #28 (permalink)  
Alt 21-11-2009, 12:47
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Naja, oder einfach 2 Selects:

Code:
select sum(number) from t1;
und
Code:
select sum(number) from t2;
und die Ergebnisse subtrahieren.
Mit Zitat antworten
  #29 (permalink)  
Alt 21-11-2009, 13:13
DerEsWissenWill
 Registrierter Benutzer
Links : Onlinestatus : DerEsWissenWill ist offline
Registriert seit: Feb 2003
Beiträge: 61
DerEsWissenWill ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Alles klar, danke Dir für die Hilfe.
(auch wenn ich nicht mehr weiß als vorher ;o)
Mit Zitat antworten
  #30 (permalink)  
Alt 21-11-2009, 13:17
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Naja, du weißt jetzt immerhin, dass es nicht so ohne weiteres mit einem einzigen Select geht und ich hab gelernt, dass ich besser aufpassen muss, worauf ich DISTINCT anwende.

Gruß,

Amica
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
PHP - SQL - Summe ? starsk8er PHP Developer Forum 1 28-02-2006 19:15
Summe berechnen thea SQL / Datenbanken 4 09-08-2005 10:05
Summe errechnen Boldiman SQL / Datenbanken 1 15-03-2004 09:29
limit bei summe ? nomidi SQL / Datenbanken 2 11-01-2003 14:10
Summe bei Vote Wotan PHP Developer Forum 5 11-06-2002 10:13

Themen-Optionen
Thema bewerten
Thema bewerten:

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 an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 10:34 Uhr.