[SQL allgemein] Problem mit Abfrage (u.a Aggregat + HAVING Klausel)

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

  • [SQL allgemein] Problem mit Abfrage (u.a Aggregat + HAVING Klausel)

    Guten Tag,

    ich habe folgendes Problem.
    Ich habe eine Tabelle epa_productprizes:
    Code:
    productprizes_id   int(11) auto_increment
    productprizes_productid   int(11)
    productprizes_supplierid   int(11)
    productprizes_userid   int(11)
    productprizes_date   int(11)
    productprizes_prize   float
    In dieser Tabelle stehen Preise von Produkten zu einem bestimmten Datum(wird in Sekunden gespeichert, was die ganzen PHP-Datumsfunktionen auch benutzen).
    In productprizes_userid steht die Benutzer-Id, von demjenigen, der diesen Preis angelegt hat und in productprizes_supplierid steht die Id für einen Anbieter(Supplier und User stehen beide einer einer Tabelle)

    Ich muss nun eine "Vergleichsfunktion" in mein Programm einbauen, dass z.B 3 Supplier verglichen werden.
    MySQL soll also nur die Preise der Artikel vergleichen, die alle 3 Supplier haben. Theoretisch könnten die Supplier auch mehrer Produkte anbieten, aber ich will eben nur alle Produkte, die alle drei Supplier anbieten und deren Preise abfragen, sodass ich eine Preisentwicklung ausgeben kann. Preise sollen auch nur miteinander verglichen werden, wenn er nicht älter als 90 Tage ist.

    Meine momentane SQL-Abfrage sieht so aus.
    $min = unter Datumsgrenze
    $slist = mit Komma separierte Supplier-Ids
    $ilist = Anzahl der Supplier
    Code:
    SELECT
      productprizes_productid
      productprizes_date
      count(productprizes_id) as cnt
    FROM epa_user
    INNER JOIN `epa_productprizes`
      ON(productprizes_supplierid = user_id)
    WHERE
      user_id IN($slist)
    AND
      productprizes_date > $min
    GROUP BY
      productprizes_productid
    HAVING cnt > $ilist
    Diese Anweisung funktioniert auch, allerdings kann ein Supplier in 90 Tagen 3 Preise haben und die anderen keinen und er würde trotzdem etwas ausgeben.

    Kann mir jemand helfen?

    greetz Flip
    Find Parties?
    Partysuche

  • #2
    Hallo nochmal,

    versteht man mein Problem nicht, oder weiß niemand eine Lösung? :-)

    greetz Flip
    Find Parties?
    Partysuche

    Kommentar


    • #3
      Ich würde es mal mit einem mehrfachen JOIN probieren

      SELECT * FROM epa_productprizes a INNER JOIN epa_productprizes b, epa_productprizes c USING (product_id) WHERE a.supplier_id = <id1> AND b.supplier_id = <id2> AND c.supplier_id = <id3>

      und dann noch weiter, ich hab nur den Anfang gemacht~

      Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

      bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
      Wie man Fragen richtig stellt

      Kommentar


      • #4
        Hi,
        danke für den heißen Tipp!!!

        Leider nimmt mein MySQL USING nach den JOINS nicht, aber ich habe nun folgenden PHP Code dazu, wo ich eben nach jedem JOIN ein USING benutze:

        PHP-Code:
                function writeProductComparison()
                {
                    if(
        is_array($this->a_comparison) && @count($this->a_comparison) > 0)
                    {
                        
        $min time() - 60*60*24*90;    //ca. 1 quarter
                        
                        
        $i 1;
                        
                        
        $table "";
                        
        $joins "";
                        
        $where = array();
                        
                        foreach(
        $this->a_comparison as $supplierId => $firm)
                        {
                            
                            
        $where[] .= "(pp$i.productprizes_supplierid = $supplierId AND pp$i.productprizes_date > $min) ";
                            if(
        $i 1)
                                
        $joins .= "INNER JOIN epa_productprizes as pp$i USING(productprizes_productid) \r\n";
                            else
                                
        $table "epa_productprizes as pp$i";
                            
        $i++;
                        }
                        
                        
        $cond = @implode(" AND "$where);
                        
                        
        $sql "SELECT * FROM $table $joins WHERE $cond";
                        echo 
        $sql;
                        
                    }
                } 
        Vielen Dank

        greetz Flip
        Find Parties?
        Partysuche

        Kommentar


        • #5
          Dann halt

          SELECT * FROM epa_productprizes a INNER JOIN epa_productprizes b, epa_productprizes c ON a.product_id = b.product_id AND b.product_id = c.product_id WHERE a.supplier_id = <id1> AND b.supplier_id = <id2> AND c.supplier_id = <id3>

          Übrigens erzeugt dein Code Überbreite. Bitte regelkonform umbrechen.

          Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

          bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
          Wie man Fragen richtig stellt

          Kommentar

          Lädt...
          X