Announcement

Collapse
No announcement yet.

SQL Join Abfrage mit count() und Datumsüberprüfung? 'Bestseller der Woche'

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • SQL Join Abfrage mit count() und Datumsüberprüfung? 'Bestseller der Woche'

    Hallo Miteinander

    Mein Ziel ist es 'Bestseller der Woche' aufzulisten. Ich habe die Tabellen mit den Daten die ich brauche verbunden.

    SQL:
    PHP Code:
    SELECT    ps_cart_product.id_cart,
                
    ps_cart_product.id_product,
                
    ps_cart_product.quantity,
                
    ps_orders.id_order,
                
    ps_orders.date_add
    FROM        ps_cart_product    INNER JOIN ps_orders
                                                    ON ps_cart_product
    .id_cart ps_orders.id_cart 
    Resultat:
    Code:
    || *id_cart* || *id_product* || *quantity* || *id_order* || *date_add* ||
    || 574 || 1129 || 4 || 120 || 2013-03-06 16:41:40 ||
    || 468 || 1126 || 3 || 110 || 2013-01-14 09:54:06 ||
    || 582 || 1126 || 1 || 123 || 2013-03-11 22:03:56 ||
    || 616 || 1126 || 10 || 127 || 2013-03-26 13:36:43 ||
    || 630 || 1126 || 1 || 128 || 2013-04-08 14:33:24 ||
    || 398 || 1125 || 3 || 99 || 2012-10-30 18:00:32 ||
    || 398 || 1125 || 3 || 99 || 2012-10-30 18:00:32 ||
    || 398 || 1125 || 3 || 99 || 2012-10-30 18:00:32 ||
    || 398 || 1125 || 6 || 99 || 2012-10-30 18:00:32 ||
    Ziel 1:
    Zuerst möchte nur die Datensätze von 'letzter Woche' über die date_add Daten filtern

    Ziel 2:
    Dann müssen bei den gleichen id_product die quantitys zusammengezählt und auf id_product Einzigartigkeit gefiltert werden.

    Wie sollte ich mein Query anpassen? Irgendwie mit COUNT() und GROUP BY() ?

    Vielen Dank schon im Voraus für die Antworten :-)

  • #2
    Hallo,
    Originally posted by Publisher View Post
    Wie sollte ich mein Query anpassen? Irgendwie mit COUNT() und GROUP BY() ?
    Ja, aber nicht irgendwie!
    Auch wirst du wohl eher die Summe der quantity haben wollen, statt nur der Anzahl. Also dann:
    SUM(quantity) und GROUP BY id_product
    Wenn du die anderen Felder (id_cart, id_order, date_add) auch im Ergebniss brauchst, dann musst du dies als Subquery lösen.

    Gruß Falk
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      Originally posted by Falk Prüfer View Post
      Hallo,

      Ja, aber nicht irgendwie!
      Auch wirst du wohl eher die Summe der quantity haben wollen, statt nur der Anzahl. Also dann:
      SUM(quantity) und GROUP BY id_product
      Wenn du die anderen Felder (id_cart, id_order, date_add) auch im Ergebniss brauchst, dann musst du dies als Subquery lösen.

      Gruß Falk
      Vielen Dank für die Hinweise.

      Hab das jetzt so gelöst:

      Code:
      SELECT    ps_cart_product.id_cart,
                  ps_cart_product.id_product,
              sum(ps_cart_product.quantity) as sales,
                  ps_orders.id_order,
                  ps_orders.date_add
      FROM        ps_cart_product    INNER JOIN ps_orders
                                             ON ps_cart_product.id_cart = ps_orders.id_cart
                                             
      WHERE       ps_orders.date_add BETWEEN '2013-01-11 00:00:00'
      											  AND '2013-04-11 00:00:00'
      GROUP BY 	ps_cart_product.id_product
      ORDER BY		sales DESC
      Code:
      || *id_cart* || *id_product* || *sales* || *id_order* || *date_add* ||
      || 468 || 877 || 77 || 110 || 2013-01-14 09:54:06 ||
      || 468 || 1079 || 57 || 110 || 2013-01-14 09:54:06 ||
      || 521 || 924 || 52 || 114 || 2013-02-04 00:05:20 ||
      || 468 || 925 || 44 || 110 || 2013-01-14 09:54:06 ||
      || 543 || 879 || 35 || 117 || 2013-02-16 00:02:18 ||
      Die Datums der letzten Woche hole ich dann mit PHP

      PHP Code:
      // Timestamp from six days
      $i_six_days 518400;

      $i_last_sunday strtotime('last sunday');
      $i_last_monday_from_last_sunday $i_last_sunday $i_six_days;

      echo 
      'Montag letzter Woche:' get_sql_datetime_format($i_last_monday_from_last_sunday) . 
              
      '<br />'.
           
      'Letzten Sonntag:'      get_sql_datetime_format($i_last_sunday); 
      Wie findet ihr die Lösung, könnte ich es noch einfacher machen?
      Zuletzt editiert von Publisher; 27.06.2013, 14:32.

      Comment


      • #4
        Hallo,
        Originally posted by Publisher View Post
        Wie findet ihr die Lösung, ...?
        Das SQL ist Murks und so nur unter MySQL lauffähig! In einer aggregierten Abfrage MÜSSEN alle Felder aus dem SELECT, die nicht aggregiert und nicht funktional abhängig sind, auch im GROUP BY aufgeführt werden. Alles Andere liefert undefinierbare Ergebnisse. Welche ps_cart_product.id_cart erhälst du bspw., ist es die Erste, die Letzte oder Irgendeine?
        Für meinen Hinweis: "Wenn du die anderen Felder (id_cart, id_order, date_add) auch im Ergebniss brauchst, dann musst du dies als Subquery lösen.", hast du dich zwar artig bedankt, aber beachtet hast du ihn nicht!

        [highlight=sql]
        SELECT ps_cart_product.id_cart,
        agg.id_product,
        agg.sales,
        ps_orders.id_order,
        ps_orders.date_add
        FROM ps_cart_product
        INNER JOIN ps_orders ON ps_cart_product.id_cart = ps_orders.id_cart
        INNER JOIN (
        SELECT ps_cart_product.id_product,
        sum(ps_cart_product.quantity) as sales
        FROM ps_cart_product
        INNER JOIN ps_orders ON ps_cart_product.id_cart = ps_orders.id_cart
        WHERE ps_orders.date_add BETWEEN '2013-01-11 00:00:00'
        AND '2013-04-11 00:00:00'
        GROUP BY ps_cart_product.id_product
        ) agg ON agg.id_product = ps_cart_product.id_product
        ORDER BY agg.sales DESC
        [/highlight]

        Gruß Falk
        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

        Comment

        Working...
        X