Absolutes Randgruppenthema und ein exotisches noch dazu, aber da ich mir für die Lösung eines Problemes stundenlang die Finger wundgegoogelt hatte, hier mal ein Treffer mehr für die Google-Suche.

Was war das Problem?

Ich habe ein Tabelle mit Bestellungen verschiedener Shops, wie etwa vereinfacht jene hier

id shop datum
 1    1 2022-12-01
 2    1 2022-12-01
 3    1 2022-12-02
 4    2 2022-12-02
 5    2 2022-12-02

Nun will ich je Shop und je Tag (und auch je Woche, je Monat, je Jahr) wissen, wie viele Bestellungen für Shop 1 und Shop 2 jeweils eingegangen sind. Das ganze auch grafisch in einem Diagramm darstellen.

Man möchte meinen, mit einem COUNT() und GROUP BY sei dies ja ganz einfach. Allerdings bekomme ich kein Ergebnis für die Tage/Wochen/Monate/Jahre, wo es bei einem Shop keine Bestellung gab.

SELECT COUNT(id) AS anzahl, shop, datum
  FROM bestellungen
  WHERE datum >= '2022-12-01' AND datum <= '2022-12-02'
  GROUP BY shop, datum

anzahl shop datum
     3    1  2022-12-01
     1    1  2022-12-02
     2    2  2022-12-02

Ich vermisse das Ergebnis "Shop 2 am 1.12.2022 Anzahl: 0"

Nun könnte man ein PHP-Skript mit Schleife machen, wo für jeden einzelnen Tag die Summe abgefragt wird. Unschön.

Hätte ich eine SQL-Tabelle mit allen relevanten Datumsangaben wie etwa dem 01.12.2022 und 02.12.2022 und könnte meine Bestellungs-Tabelle mit jener Verknüpfen, würde ich Ergebnisse bekommen.
Aber für eine Abfrage extra eine Tabelle generieren? Unschön.

Dann bin ich darauf gestoßen, dass man sehr wohl über einen select ohne Bezug zu einer Tabelle zu nehmen, Datumsintervalle generieren kann.
Wie zum Beispiel hier alle Kalenderwochen von vom 26.12.2022 bis 5.2.2023:

SELECT DATE_FORMAT(DATE_ADD('2022-12-26', INTERVAL (@i:=@i+1)-1 WEEK), 'KW %v/%Y') AS DATE
  FROM information_schema.columns,(SELECT @i:=0) gen_sub
  WHERE DATE_ADD('2022-12-26',INTERVAL @i WEEK) BETWEEN '2022-12-26' AND '2023-02-05'

date    
KW 52/2022
KW 01/2023
KW 02/2023
KW 03/2023
KW 04/2023
KW 05/2023

Daraus habe ich mir einen select gebaut, der mir die Anzahl der Bestellungen je Shop und je Kalenderwoche ausgibt und dabei auch die Anzahl 0 berücksichtigt:

SELECT
   date_generator.date AS datum,
   IFNULL(COUNT(shop_bestellung.id), 0) AS anzahl
FROM (
   SELECT DATE_FORMAT(DATE_ADD('2022-12-26', INTERVAL (@i:=@i+1)-1 WEEK), 'KW %v/%Y') AS DATE
        FROM information_schema.columns,(SELECT @i:=0) gen_sub
        WHERE DATE_ADD('2022-12-26',INTERVAL @i WEEK) BETWEEN '2022-12-26' AND '2023-02-05'
      ) date_generator
LEFT JOIN bestellungen ON
  DATE_FORMAT(datum, 'KW %v/%Y') = date_generator.date
  GROUP BY DATE