Zum Inhalt springen

mysql erweiterung typo3

Erstellt am 8. September 2006 · 19 Antworten · letzte Antwort am 12. September 2006

Tags: Datenbank, Frage

MichaelJason ·

Ich habe eine Frage bezüglich mysql sub Select! Da hänge ich gerade

meine anfrage ist

$sql="SELECT *, COUNT(kid) AS anzahl1,
(SELECT COUNT(vvl) FROM KUNDE
WHERE vvl = 'ja'
AND ab_anbieter = '$anbieter'
AND erfassung >= '$von'
AND erfassung <= '$bis') AS anzahl2

FROM kunde
WHERE ab_anbieter = '$anbieter'
AND erfassung >= '$von'
AND erfassung <= '$bis'
AND ab_netz != 'frei'
AND vvl = 'nein'
AND barverkauf = 'nein'
GROUP BY ab_netz";

Das klappt auch alles schön nur möchte ich das die Subselect abfrage auch nach dem ab_netz gruppiert wird nur das scheint nicht erlaubt zu sein

Hat jemand eine IDEE??

Gruß Michael

woida ·

Ja, es scheitert am * aus dem SELECT, da der "*" keine Aggregatsfunktion ist.
Beispiel: Du hast folgende Tabelle:

id|Produkt|Anzahl
1|Apfel |10
2|Apfel |20
3|Apfel |40
4|Brine | 5

Jetzt versuch mal, nach Apfel zu gruppieren und im Ergebniss auch noch die id anzeigen zu lassen (SELECT *, COUNT(Anzahl) FROM _tabellenname_ GROUP BY Produkt). Das macht natürlich keinen Sinn! (und funktioniert auch gar nicht)

Was hingegen geht:
SELECT Produkt, COUNT(Anzahl) FROM _tabellenname_ GROUP BY Produkt

Dann bekommst du:

Produkt| COUNT(Anzahl)
Apfel | 70
Birne | 5

MichaelJason ·

Ich denke du hast bestimmt eine Idee wie man das machen kann. Denn es scheint nicht so ganz einfach zu sein zwei selectabfragen zusammenzufügen und eine draus zu machen:

diese gibt mir gruppiert nach dem ab_netz die anzhal der 'kid' aus wobei das feld vvl hier 'nein' ist

$sql="SELECT ab_netz, COUNT(kid) AS anzahl1 FROM kunde
WHERE ab_anbieter = '$anbieter'
AND erfassung >= '$von'
AND erfassung <= '$bis'
AND ab_netz != 'frei'
AND vvl = 'nein'
AND barverkauf = 'nein'
GROUP BY ab_netz";

diese gibt mir gruppiert nach dem ab_netz die 'vvl' wobei die vvl hier 'ja' ist !

$sql="SELECT COUNT(vvl) AS anzahl2 FROM kunde
WHERE ab_anbieter = '$anbieter'
AND erfassung >= '$von'
AND erfassung <= '$bis'
AND ab_netz != 'frei'
AND vvl = 'ja'
AND barverkauf = 'nein'
GROUP BY ab_netz";

Beide abfragen machen genau das was sie sollen wenn ich sie einzeln abfrage.
Allerdings müsste ich dann die ausgabe einer oder gar beider in einem array festhalten weil ich sie sonst nicht in einer Tabellen ausgeben kann. Darum habe ich versucht diese zusammen zubasteln.

Also wenn du beide zusammenbasteln kannst wäre das klasse

Im voraus besten Dank

Gruß Michael

p.s schönes WE

MichaelJason ·

UNION war keine schlechte Idee aber er gibt mit nun folgendes aus

D1 Vertrag 2
D1 VVL

D2 Vertrag 19
D2 VVL

E-Plus Vertrag 4
E-Plus VVL

O2 Vertrag 18
O2 VVL

D2 Vertrag 3
D2 VVL

O2 Vertrag 2
O2 VVL


Gesamt Handys 48
Gesamt VVL 0

-----------------------

Ziel war aber folgendes

D1 Vertrag 2
D1 VVL

D2 Vertrag 19
D2 VVL 3

E-Plus Vertrag 4
E-Plus VVL

O2 Vertrag 18
O2 VVL 2

Gesamt Handys 43
Gesamt VVL 5

der abfrage scheint es wohl missfallen zu sein, das ich "anzahl1" und "anzahl2" definiert habe er schreib mir nämlich alles nur noch in anzahl1 und somit ist das Ergebnis falsch!

$sql="(SELECT ab_netz, COUNT(kid) AS anzahl1 FROM kunde
WHERE ab_anbieter = '$anbieter'
AND erfassung >= '$von'
AND erfassung <= '$bis'
AND ab_netz != 'frei'
AND vvl = 'nein'
AND barverkauf = 'nein'
GROUP BY ab_netz)
UNION
(SELECT ab_netz, COUNT(vvl) AS anzahl2 FROM kunde
WHERE ab_anbieter = '$anbieter'
AND erfassung >= '$von'
AND erfassung <= '$bis'
AND ab_netz != 'frei'
AND vvl = 'ja'
AND barverkauf = 'nein'
GROUP BY ab_netz)";

woida ·

Dann probier mal
...SELECT ab_netz, COUNT(kid), 0 AS anzahl1 FROM kunde...

...SELECT ab_netz, 0, COUNT(kid) AS anzahl2 FROM kunde...

MichaelJason ·

Das führte nur zu diesem Ergebnis das die anzahl1 nicht berücksichtig wird siehe unten. Außerdem hat er immer noch alle Ergebnisse in anzahl1 stehen

D1 Vertrag
D1 VVL

D2 Vertrag
D2 VVL

E-Plus Vertrag
E-Plus VVL

O2 Vertrag
O2 VVL

D2 Vertrag 3
D2 VVL

O2 Vertrag 2
O2 VVL

Gesamt Handys 5
Gesamt VVL 0

woida ·

Dein Ansatz ist ja auch falsch:
Wirf das 2. Select weg und gruppiere in der 1. Abfrage noch zusätzlich nach "vvl".
Die Gesamtsumme kannst du dann mit 2 SELECTS (einmal für Handy, und für VVL), die du mittels UNION dazufügst, bestimmen.

MichaelJason ·

Das klappt so doch nicht weil in dem einem Select vvl=ja ist und in dem andern vvl=nein wenn ich alles in ein select reinschreibe dann liest er mir entweder alle aus die vvl= ja sein oder eben alle deren vvl = nein ist.

Die gesamtsumme dird einfach nur durch

$summe = $summe + $anzah1 in der while schleife addiert da brauch ich keine select ausgabe für :-)

Wenn du die select anweisungen nochmal durchgehst siehst du doch wo die unterschiede sind !

Wenn es so einfach wäre da hätte ich es doch schon hinbekommen. Das min dem Union war ein guter ansatz nur das er eben die anzahl2 der anzahl1 hinzufügt und das ist eben falsch.

dabei ist wirklich nur diese Ausgabe relevant

D1 Vertrag 2
D1 VVL

D2 Vertrag 19
D2 VVL 3

E-Plus Vertrag 4
E-Plus VVL

O2 Vertrag 18
O2 VVL 2

Du hast doch den kompletten code bastel mal eine selectanweisung zusammen wie du denkst das es stimmen könnte falls ich dich da falsch verstanden haben sollte .

woida ·

Wirf das 2. Select weg und gruppiere in der 1. Abfrage noch zusätzlich nach "vvl".

=> SELECT ab_netz, vvl, COUNT(kid) FROM kunde GROUP BY ab_netz, vvl

War doch etz nicht so schwer?

Die Gesamtsumme könntest du auch mit einem UNION SELECT ermitteln.

MichaelJason ·

du vergisst aber anscheinend immer die abfrage vvl = nein und vvl = ja !!! das haut nicht hin ! bei den ergebnisssen von count(kid) MUSS vvl = nein sein
und bei count(vvl) muss vvl = ja sein das sind ganz untereschiedliche ergebnisse darum ja auch zwei abfragen

wenn ich deinen vorschlag nehme dann

bekomme ich alles nach vvl gruppiert das bringt mir aber nix weil ich möchte ja die vvl D1 D2 O3 und Debitel zuordnen können und nicht nur alles zusammen zu vvl addieren

woida ·

du vergisst aber anscheinend immer die abfrage vvl = nein und vvl = ja !!! das haut nicht hin !

Dafür habe ich ja das "vvl" in der Gruppierung: "GROUP BY ab_netz, vvl"

Wieso postest du nicht einfach deine Abfrage und das Ergebniss?

MichaelJason ·

Auf der Seite 1 steht genau das hier! Und genau dieses sql Statment steht in meinem php dokument wie du es mir mit union erklärt hast.

Die weiteren änderungen habe ich zwar ausprobiert hatten aber kein besseres Ergebnis geliefert. meine Bitte war ja: stell dieses sql-Statment so um das
es das Ergebnis ganz unten liefert wobei die gesamt summe nicht abgefragt werden soll sondern wirklich nur das was in dem sql steht!

Wobei darauf zu achten ist das in dem ersten select vvl= nein sein muss und im zweiten select vvl= ja sein muss! Dabei müssen beide nach den selben Kriterien sortiert werden (siehe Ausgabe).

Kurzfassung beide select anweisung machen genau das was sie sollen ich möchte es aber erreichen das BEIDE in einem $sql ausgelesen werden damit ich das besser ausgeben kann :-)

Meine Bitte war ja das du den Code ab $sql bis .... ; schreibst damit ich auch wirklich keinen Fehler machen kann quasi Copy and Paste von hier ins dokument zum testen, weil ich vielleicht etwas anders mache als du es dir ausgedacht hast .

$sql="(SELECT ab_netz, COUNT(kid) AS anzahl1 FROM kunde
WHERE ab_anbieter = '$anbieter'
AND erfassung >= '$von'
AND erfassung <= '$bis'
AND ab_netz != 'frei'
AND vvl = 'nein'
AND barverkauf = 'nein'
GROUP BY ab_netz)
UNION
(SELECT ab_netz, COUNT(vvl) AS anzahl2 FROM kunde
WHERE ab_anbieter = '$anbieter'
AND erfassung >= '$von'
AND erfassung <= '$bis'
AND ab_netz != 'frei'
AND vvl = 'ja'
AND barverkauf = 'nein'
GROUP BY ab_netz)";

AUSGABE:

D1 Vertrag 2
D1 VVL

D2 Vertrag 19
D2 VVL

E-Plus Vertrag 4
E-Plus VVL

O2 Vertrag 18
O2 VVL

D2 Vertrag 3
D2 VVL

O2 Vertrag 2
O2 VVL

-----------------------

Ziel war aber folgendes

D1 Vertrag 2
D1 VVL

D2 Vertrag 19
D2 VVL 3

E-Plus Vertrag 4
E-Plus VVL

O2 Vertrag 18
O2 VVL 2

woida ·
woida schrieb

Wirf das 2. Select weg und gruppiere in der 1. Abfrage noch zusätzlich nach "vvl".

=> SELECT ab_netz, vvl, COUNT(kid) FROM kunde GROUP BY ab_netz, vvl

Wenn du diese SQL-Anweisung nicht ausführen kannst und das Ergebniss dann posten kannst, kann ich dir leider nicht weiter helfen.

MichaelJason ·

Hi ich werde das heute Abend so gegen 18:00 zuhause nochmal testen gestern gings mal nicht.

sag dir dann bescheid wenn sich was geändert haben sollte Aber erstmal danke

MichaelJason ·

Hi

wie gesagt das ist nicht wirklich das was ich brauche :-)

$sql="SELECT ab_netz, COUNT(kid) AS anzahl1 FROM kunde
WHERE ab_anbieter = '$anbieter'
AND erfassung >= '$von'
AND erfassung <= '$bis'
AND ab_netz != 'frei'
AND barverkauf = 'nein'
GROUP BY ab_netz,vvl";

das habe ich gemacht und das da unten Spuckt er mir aus ! da er nicht unterteilt nach vvl und normaler Vertrag schreib er mir schön alles untereinander aber ich kann jetzt nicht mehr unterscheiden ziwschen einem VERTRAG und dem VVL ich glaub ich kann das Haken das klappt nicht muss ich eben die Schwache zweite lösung nehmen und bei unabhängig voneinander ausgeben verdammt.

Original 01.01.2000 31.12.2008

Anzahl
D1 Vertrag 2
D1 VVL

D2 Vertrag 2
D2 VVL

D2 Vertrag 19
D2 VVL

E-Plus Vertrag 4
E-Plus VVL

O2 Vertrag 2
O2 VVL

O2 Vertrag 18
O2 VVL


Gesamt Handys 47
Gesamt VVL 0

woida ·

Naja, auch richtig Abschreiben ist eine Kunst sein ...

Dein Query:

SELECT ab_netz, COUNT(kid) AS anzahl1 FROM kunde...

Mein Query:

SELECT ab_netz, vvl, COUNT(kid) AS anzahl1 FROM kunde...

Der Unterschied sollte offensichtlich sein und auch erklären, warum dein Query nicht das ausgibt, was du erwartest.

MichaelJason ·

Moin ich hab gestern auch das hier versucht und auch deine Variante

deine !
SELECT ab_netz, vvl, COUNT(kid) AS anzahl1 FROM kunde...

Mein Versuch

SELECT ab_netz, COUNT(vvl) AS anzahl, COUNT(kid) AS anzahl1 FROM kunde...

Aber das Problem bleibt wie gesagt! Die Ausgabe ist die gleiche weil eben das Feld vvl ja und nein beinhaltet und es wichtig ist das das vvl bei der einen abfrage ja ist und bei der anderen nein hat sich nicht viel geändert.

Natürlich hast du recht er findet in der Tat das Ergebnis aber er speichert es in komplett in Anzahl1. Un wenn ich es ausgebe schreibt er mir natürlich auch alle Ergebisse schön untereinander nur weiß ich dann eben nicht ob es ein vvl oder ein neuer Vertrag ist.

Ich habe nun wieder zwei sql abfragen gemacht und die Ausgabe untereinander gemacht zuerst nur die Vertäge und dann nur die vvls das geht auch.

Aber auf jeden Fall Danke für die Unterstützung.

Musste damit ja endlich fertig werden :-)

Habe nun allerdings ein letztes Problem mit Typo3 das mich auch noch sehr beschäftigt. Vielleicht hast du da auch noch einen Typ.

Ich würde gerne im Frontend meiner Typo3 Seite Seiten als User editieren können und zwar so das ich jederzeit auf der Webseite bin und wenn ich auf meinen Bleistift zum ändern klicke nicht 1tens die Oberfläche des Backends sehe und zweitens nicht auf eine neue Seite verlinkt werde inder das Änderungsfenster erscheint!. Ich möchte alles auf einer Seite haben.

(Habe das auf der Cebit gesehen 2006) Aber es steht nirgends wie man es Konfiguriert. Habe einer Gruppe mittlerweile alle Rechte gegeben und auch den Zugriff so eingestellt das ich alles machen darf. Aber sobald ich im Frontend angemeldet bin kann ich zum Bespiel Seiten nicht verschieben (nach oben oder unten) und ich möchte auch adas Admin Panel nicht sehen. Es gibt ein editier Panel das hat dich wichtigsten Funktionen die man braucht. Aber wenn ich mit dem Mauszeiger drübergehe sind alle Funktionen deaktiviert. Liegt eben an meiner Unwissenheit.

und als letzten Punkt möchte ich im Frontend den Usernamen ausgeben der eingeloggt ist. Und zwar möchte ich den in dem Makrer ###ANGEMELDET### ausgeben.
Ich habe dazu eine php zeile schreiben müssen.

<?
print $UserName = $GLOBALS['TSFE']->fe_user->user['username']
?>

Nur weiß ich nun nicht wie ich das über das TS SETUP in den MARKER bekomme

Am WE habe ich mir die Extension angesehen bei Typo3.org

und werde mir jetzt die drei Sachen installieren (habe alle was mit der integration von php dateien in Typo3 zu tun vielleicht braucht man das)

- lumophpinclude_1.1.1.t3x
- gb_customhome_0.3.0.t3x
- nc_pdfgen_0.1.4.t3x

Wenn du dazu noch ne Idee hast wäre das klasse

Gruß michael