Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] SQL Abfragenoptimierung für PHP Einsatz

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] SQL Abfragenoptimierung für PHP Einsatz

    Guten Morgen liebe Community,

    ich habe eine, bzw. drei Abfragen geschrieben, um das gewünschte Ergebnis zu erlangen, welches nun lauffähig ist. Jedoch die Eingabe in PHP und die Ausführung darin gefällt mir sehr wenig.

    Der momentane SQL-Befehl sieht so aus:
    Code:
    CREATE VIEW TempView AS
                             SELECT Month(k.anlagedatum) AS Monat,Monthname(k.anlagedatum) AS Monatsname,Year(k.anlagedatum) AS Jahr 
                             FROM fahrzeugliste as f JOIN kunden as k
                             ON f.KundenNummer = k.kundennummer
                             WHERE f.StatusID = 1
                             GROUP BY f.KundenNummer,Jahr,Monat
                             ORDER BY k.anlagedatum ASC;                        
                             SELECT count(*) AS Anzahl,Monat,Monatsname,Jahr FROM TempView
                             Group By Monat,Jahr
                             ORDER BY Jahr,Monat ASC;                        
                             DROP VIEW TempView;

  • #2
    Jedoch die Eingabe in PHP und die Ausführung darin gefällt mir sehr wenig.
    Was meinst du damit? PHP wird auch üblicherweise dazu verwendet "Eingaben" zu verarbeiten und was meinst du mit gefallen?
    The string "()()" is not palindrom but the String "())(" is.

    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
    PHP.de Wissenssammlung | Kein Support per PN

    Kommentar


    • #3
      Ich denke mal, dass er auf multiquery() oder ähnliches zurückgreifen muss um das gewünschte Ergebnis zu erzielen.

      Der momentane SQL-Befehl sieht so aus:
      Am einfachste wäre es, wenn du mal beispielhaft zeigst wie die Ursprungsdaten aussehen und beschreibst, was du als Ergebnis haben möchtest.
      Gerne über http://sqlfiddle.com/
      Habs nur überflogen, aber auf die View lässt sich bestimmt verzichten. Joins oder Subqueries schon versucht?
      [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
      [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

      Kommentar


      • #4
        Ja ich habe bereits subqueries und joins versucht, jedoch stoße ich da gerade leider an meinen Grenzen.
        Ich kann die gesamte Situation erklären.
        Ich habe bestimmte Fahrzeugdaten. Wenn ein Fahrzeug aktiv ist, also Status = 1 hat dann ist der dazugehörige Kunde noch aktiv hier als Kunde. Jetzt muss ich jedoch Wissen welcher Kunde pro Monat dazugekommen ist, sprich alles nach Monat und Jahr nochmals gruppieren. Wenn ich jetzt die andere Gruppierung nochmals nach Monat und Jahr in der View weglasse also der Select auf die View dann bekomme ich Werte die nicht so klein sind wie zu erwarten sondern für jeden Kunden einzeln. Lasse ich jedoch das Gruppieren in der Create-View weg dann bekomme ich werte die unlogisch sind, da sie viel zu groß sind.

        Kommentar


        • #5
          Subquery sieht so aus: (formatieren darft du selbst)
          PHP-Code:
                                   SELECT count(*) AS Anzahl,Monat,Monatsname,Jahr FROM   (SELECT Month(k.anlagedatum) AS Monat,Monthname(k.anlagedatum) AS Monatsname,Year(k.anlagedatum) AS Jahr 
                                   FROM fahrzeugliste 
          as f JOIN kunden as k
                                   ON f
          .KundenNummer k.kundennummer
                                   WHERE f
          .StatusID 1
                                   GROUP BY f
          .KundenNummer,Jahr,Monat
                                   ORDER BY k
          .anlagedatum ASCTempView
                                   Group By Monat
          ,Jahr
                                   ORDER BY Jahr
          ,Monat ASC
          Aber der Ansatz und die Erklärung ist verwirrend. Willst du wissen wieviele Kunden pro Monat neu hinzukommen oder Fahrzeuge? Bei ersteren kannst du dich nicht auf die aktive Fahrzeuge beziehen, ein Kunde kann mehrere haben und auch wechseln. Damit rutscht das Datum der Kundengewinnung immer mit. Wenn dann müsstest du dich auf das älteste Fahrzeug beziehen was der Kunde hatte.
          Der richtige Ansatz wäre also in einen Query für jeden Kunden das erste Fahrzeug (bzw. das Datum dafür, was auch einfacher ist) zu ermitteln und dies dann zu gruppieren.

          Kommentar


          • #6
            Vielen Dank für den sehr guten Ansatz. Ja ich möchte wissen welcher Kunde neu hinzugekommen ist und das finden wir hier via Fahrzeugstatus heraus. Wird ein Fahrzeug abgeschaltet erhält dieser einen anderen Status und ist für diesen Kunden auch nicht aktiv. Falls dies das einzige Fahrzeug von diesem Kunden war ist der Kunde für uns deaktiv. Der Neukunde wird mit dem anlagedatum also festgelegt.

            Dein SQL-Select funktioniert aber wirklich wunderbar, genau das Ergebnis habe ich gebraucht. Vielen Dank

            Kommentar


            • #7
              Zitat von ShadowCastiel Beitrag anzeigen
              Dein SQL-Select funktioniert aber wirklich wunderbar, genau das Ergebnis habe ich gebraucht. Vielen Dank
              Das ist dein Query, ich hab nur dein View als Subquery reingesetzt. Ich würde aber an deiner Stelle nochmal genau hinschauen was du da bekommst. Hat ein Kunde mehrere aktive Fahrzeuge mit unterschiedlichen Daten (plural Datum) dann wird er auch mehrmals gezählt. Damit zählst du dann wieviele Kunden pro Monat ein oder mehrer Fahrzeug neu "gebucht" haben.

              Kommentar

              Lädt...
              X