2016-06-20 11 views
0

Ich habe folgendes Schema beitreten: http://sqlfiddle.com/#!9/bd3a4/1 Ich würde nach Datum Gruppe mögen() und füge wo user_id = .. pro Tag und die Ergebnisse pro Tag zählen?. Ergebnis Day erforderlich | TotalRequests | Gesamtaufträgewie nach Datum mehr mysql Gruppe verlassen

+1

Danke für die Geige. Aber fügen Sie auch alle notwendigen Informationen in die Frage ein. Links brechen, besonders SQLFiddle. Und wir wollen, dass Beiträge für zukünftige Besucher nützlich sind. –

Antwort

1

Da Sie einen Auftrag an Tag 1, und eine Anfrage an Tag 8 haben könnten, können Sie Einträge auf einer Seite aber nicht der andere. Um Ihre Bedürfnisse zu qualifizieren, würde ich eine UNION aller Bestellungen und Anfragen individuell nach Datum vornehmen. Dann roll diese Werte hoch. Bei der Abfrage des Ergebnisses der inneren Präaggregation wird die WHERE-Klausel pro Benutzer angewendet. Die Pre-Aggregate-Abfrage enthält außerdem eine recSource-Spalte, die angibt, woher der Datensatz stammt, als "O" von Bestellungen und "R" von Anfragen, sodass der Roll-up weiß, in welcher Spalte die Gesamtzahl gespeichert werden soll.

select 
     preAgg.recDate, 
     SUM(case when preAgg.recSource = 'O' then preAgg.recCount else 0 end) as OrderCount, 
     SUM(case when preAgg.recSource = 'R' then preAgg.recCount else 0 end) as RequestCount 
    from 
     (select 
       date(o.created_at) recDate, 
       'O' as recSource, 
       count(*) as recCount 
      from 
       orders o 
      where 
       o.user_id = 3 
      group by 
       date(o.created_at) 
     UNION ALL 
     select 
       date(r.created_at) recDate, 
       'R' as recSource, 
       count(*) as recCount 
      from 
       requests r 
      where 
       r.user_id = 3 
      group by 
       date(r.created_at)) preAgg 
    group by 
     preAgg.recDate 
    order by 
     preAgg.recDate 

Für die Abfrageoptimierung, würde ich Ihre Bestellung und Anforderungstabelle sicherzustellen, haben beide einen Index auf (user_id, created_at).

SQL Fiddle result

+0

das ist großartig, wusste nicht, diese Technik, wie würde ich hinzufügen, sagen wir provisions_tabelle und SUM (provisions.amount) per Datum(), in diesem Fall werden wir nicht in der Lage sein, UNION zu verwenden. – dflow

+0

@ dflow, gleichen Prozess, fügen Sie einfach eine zusätzliche ... "UNION ALL", aber haben die gleiche Spalte/Summe/Gruppe nach Kontext. Legen Sie die recSource für "C" (nur als Beispiel) auf "C" fest. und ändern Sie von COUNT (*) zu SUM (commission.Amount) als recCount, damit es den äußeren Abfrageerwartungswerten entspricht. Und dann fügen Sie einen endgültigen SUM (Fall/wann) für die Kommission recSource value = "C" – DRapp

+0

groß, eine weitere Sache die Kommission. Der Betrag ist von dezimaler Art, so dass alle Ergebnisse im Dezimalformat zurückgegeben werden, so zählt es 84,00 usw., Wie kann ich das Ergebnisspaltenformat einstellen? – dflow

0

können Sie die folgende Abfrage verwenden:

SELECT 
DATE(o.created_at) AS Day 
,COUNT(r.id) AS TotalRequests 
,COUNT(o.id) AS TotalOrders 
FROM orders o 
LEFT JOIN 
requests r ON 
r.id = o.request_id 
WHERE o.user_id = 3 
GROUP BY DATE(r.created_at), DATE(o.created_at),o.user_id 
+0

danke für die Antwort, wie würde ich das Ergebnis zu Day | kombinieren TotalRequests | TotalOrders – dflow

+0

@ dflow überprüfen Sie meine Bearbeitung .. –

+0

dies liefert nicht die richtigen Daten. – dflow