Ankündigung

Einklappen
Keine Ankündigung bisher.

Gruppieren, Sortieren, Limitieren und Aktualisieren...

Einklappen

Neue Werbung 2019

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

  • Gruppieren, Sortieren, Limitieren und Aktualisieren...

    Guten Tag ,

    ich möchte eine Schleife, welche ich über PHP realisiert habe optimieren bzw. direkt in MySQL ausführen.

    Tabelle mit ca. 250k - 1m Datensätzen.

    Im Normalfall kommt jedes Produkt min. einmal und maximal viermal vor.
    Ich muss das günstigste Produkt "aktivieren" => Markierung.

    SELECT Hersteller, Werksartikelnummer FROM tabelle GROUP BY Hersteller, Werksartikelnummer;

    SELECT id FROM tabelle WHERE Hersteller = 'Hersteller-v-Oben' AND Werksartikelnummer = 'Werksartikelnummer-v-Oben' ORDER BY Einkaufspreis ASC LIMIT 1;

    UPDATE tabelle SET Markierung = 1 WHERE id = 'id-v-oben';


    Im Voraus vielen Dank für euere Gedanken.

  • #2
    Das kannst du alles in einem Update Query machen, indem du in der Where Clause einen Subquery machst, welcher dir ID des günstigsten Produkts gibt.
    "Software is like Sex, it's best if it's free." - Linus Torvalds

    Kommentar


    • #3
      Nur wie komme ich an die IDs aller günstigsten Produkte?

      Gut - "Erledigt".

      SELECT * FROM tabelle WHERE (Hersteller, Werksartikelnummer, Einkaufspreis) IN (SELECT Hersteller, Werksartikelnummer, MIN(Einkaufspreis) FROM tabelle GROUP BY Hersteller, Werksartikelnummer);

      Doch was mache ich, wenn bei einem Produkt zwei identische Einkaufspreise existieren?!


      Kommentar


      • #4
        Wie meinst du denn das mit den vier gleichen Produkten? Die haben schon alle eine eigene ID und Produktnummer?
        "Software is like Sex, it's best if it's free." - Linus Torvalds

        Kommentar


        • #5
          Gleiches Produkt bei verschiedenen Lieferanten zu verschiedenen Konditionen => verschiedene Einkaufspreise - manchmal auch die Gleichen.

          Soll aber nur ein Datensatz als "primär" markiert sein.

          Kommentar


          • #6
            An dieser Stelle machts am meisten sind einfach ein paar Beispieldaten (+ Tabellenstrukturen) zu zeigen und anhand derer gleich zeigen wie das Ergebnis aussehen soll.
            [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


            • #7
              Bei gleichen Einkaufspreisen musst du dir überlegen welchem Lieferanten du den Vortritt gibst. Das kannst du dann mit ORDER BY FIELD()
              in eine eigene Reihenfolge bringen.

              Beispiel
              PHP-Code:
              SELECT id
              FROM 
              `Lieferant`
              WHERE 1
              ORDER BY FIELD
              id324
              Gibt dir die Reihenfolge 3 2 4 1 zurück

              Wenn du dann nur die 3 haben willst, dann mit Limit 1 am Ende,
              sollte id 3 nicht vorhanden sein, wird automatisch die nächst nachfolgende Nr. gewählt, da hier ASC zum Zuge kommt, man kann auch hier DESC für umgekehrte Rehienfolge anwenden. Field ist nicht auf Integer begrenzt, somit kann man auch stings einer eigenen Sortierung unterziehen.

              Funktioniert so viel ich weiss nur mit mysql, da es eine spezielle Funktion von Mysql ist.
              Beachtet werden sollte vielleicht noch, dass es die Abfrage langsamer macht und wenn man viele Daten hat die Sortierreihenfolge in eine eigene Tabelle untergebracht werden sollte.



              Kommentar


              • #8
                Zitat von Teddie Beitrag anzeigen
                Doch was mache ich, wenn bei einem Produkt zwei identische Einkaufspreise existieren?!
                Z.B. kannst du nochmal gruppieren...

                Code:
                SELECT MIN(id), Hersteller, Werksartikelnummer FROM tabelle WHERE (Hersteller, Werksartikelnummer, Einkaufspreis) IN (SELECT Hersteller, Werksartikelnummer, MIN(Einkaufspreis) FROM tabelle GROUP BY Hersteller, Werksartikelnummer) GROUP BY Hersteller, Werksartikelnummer
                Zusammengefasst mit dem UPDATE: (entfernt auch die alten Markierungen)

                Code:
                UPDATE
                    tabelle LEFT JOIN
                    (
                        SELECT MIN(id) AS id FROM tabelle WHERE (Hersteller, Werksartikelnummer, Einkaufspreis) IN (SELECT Hersteller, Werksartikelnummer, MIN(Einkaufspreis) FROM tabelle GROUP BY Hersteller, Werksartikelnummer) GROUP BY Hersteller, Werksartikelnummer
                    ) AS best USING (id)
                SET
                    tabelle.Markierung = IF(best.id IS NULL, 0, 1)

                Kommentar


                • #9
                  Zitat von VPh Beitrag anzeigen
                  An dieser Stelle machts am meisten sind einfach ein paar Beispieldaten (+ Tabellenstrukturen) zu zeigen und anhand derer gleich zeigen wie das Ergebnis aussehen soll.
                  Beispiel:
                  Generiert werden die Daten immer mit Markierung "0".
                  id Hersteller Werksartikelnummer Einkaufspreis Lieferant Markierung
                  1 32 12345 123 1 1 < niedriger Preis - aktiv
                  2 32 12345 129 2 0 < höherer Preis - nicht aktiv
                  3 32 67890 234 1 0 < gleicher Preis - egal welches aktiv
                  4 32 67890 234 2 1 < gleicher Preis - aber nur eins
                  5 32 13579 345 3 1 < ein Preis - aktiv

                  @protestix: Bin mir nicht sicher an welcher Stelle ich die Reihenfolge einbauen kann - vor allem mit LIMIT - würde doch die Ausgabe auf eine id beschränken - und somit nur einen Datensatz aktiv schalten?

                  Kommentar


                  • #10
                    Zitat von erc Beitrag anzeigen

                    Z.B. kannst du nochmal gruppieren...

                    Code:
                    SELECT MIN(id), Hersteller, Werksartikelnummer FROM tabelle WHERE (Hersteller, Werksartikelnummer, Einkaufspreis) IN (SELECT Hersteller, Werksartikelnummer, MIN(Einkaufspreis) FROM tabelle GROUP BY Hersteller, Werksartikelnummer) GROUP BY Hersteller, Werksartikelnummer
                    Zusammengefasst mit dem UPDATE: (entfernt auch die alten Markierungen)

                    Code:
                    UPDATE
                    tabelle LEFT JOIN
                    (
                    SELECT MIN(id) AS id FROM tabelle WHERE (Hersteller, Werksartikelnummer, Einkaufspreis) IN (SELECT Hersteller, Werksartikelnummer, MIN(Einkaufspreis) FROM tabelle GROUP BY Hersteller, Werksartikelnummer) GROUP BY Hersteller, Werksartikelnummer
                    ) AS best USING (id)
                    SET
                    tabelle.Markierung = IF(best.id IS NULL, 0, 1)
                    Danke für den Schubs in die richtige Richtung.


                    Vielen Dank an alle!
                    5 Sekunden ca. besser als 120 Sekunden mit php Schleifen.

                    Kommentar

                    Lädt...
                    X