2012-12-06 11 views
13
SELECT User_JoinDate, 
COUNT(User_ID) 
FROM Users WHERE `User_JoinDate` 
BETWEEN '2012-11-22' AND '2012-12-06' 
GROUP BY User_JoinDate 
ORDER BY User_JoinDate ASC" 

Generuję dane do wyświetlenia na wykresie liniowym. Niestety nie mogę wymyślić, jak uzyskać powyższe zapytanie, aby wyświetlić 0 dla daty, której żaden użytkownik nie mógł zarejestrować. Więc obecnie moje wyjście może być coś takiego:Pokaż wszystkie daty między, nawet jeśli nie ma wyniku

 
2012-11-22 - 2 
2012-11-25 - 4 

Ale co chcę jest

 
2012-11-22 - 2 
2012-11-23 - 0 
2012-11-24 - 0 
2012-11-25 - 4 

ja mam obecnie wersję roboczą, która przechowuje MySQL doprowadzić do tablicy, a następnie PHP pętle przez i wypełnia puste miejsca. Wydaje się to bardzo niechlujne i miałem nadzieję, że za pośrednictwem MySQL pojawi się rozwiązanie. Miałem dobre przeszukiwanie strony, ale starałem się zrozumieć niektóre z jej implementacji. Jakieś sugestie?

+0

Jako miejsce do rozpoczęcia Chciałbym utworzyć kwerendę, która daje wszystkich dat (I nie jestem pewien jak, ale jestem pewien, że tam jest), a następnie zrób z nim sprzężenie. – ajon

Odpowiedz

11

Możesz zbudować zautomatyzowany zestaw wyników przy użyciu zmiennych MySQL dla wszystkich żądanych dat.

select 
     AllDaysYouWant.MyJoinDate, 
     count(U.User_ID) as NumberJoined 
    from 
     (select 
       @curDate := Date_Add(@curDate, interval 1 day) as MyJoinDate 
      from 
       (select @curDate := '2012-11-21') sqlvars, 
       Users 
      limit 18) AllDaysYouWant 
     LEFT JOIN Users U 
     on AllDaysYouWant.MyJoinDate = U.User_JoinDate 
    group by 
     AllDaysYouWant.MyJoinDate 

Zapytanie wewnętrzna, ja właśnie dołączył do tabeli użytkowników bez klucza, więc jej tylko używany do cyklu przez X liczba zapisów do reprezentowania rozpiętość dnia chcesz ... Może to być 30, 100 , cokolwiek ... Tak długo jak stół (w tym przypadku użytkownicy), ma tyle rekordów, ile się spodziewasz.

THEN, ten wynik z niczego oprócz dni jest dołączany do tabeli użytkowników, ale tym razem w oparciu o JOIN_DATE użytkownika. Prosta funkcja COUNT() powinna dać ci to, czego chcesz.

W „AllDaysYouWant” jest alias przypisane do wewnętrznej części zapytania pierwszy

(select 
      @curDate := Date_Add(@curDate, interval 1 day) as MyJoinDate 
     from 
      (select @curDate := '2012-11-21') sqlvars, 
      Users 
     limit 18) AllDaysYouWant 

Zasadniczo stwierdza ... Z tabeli użytkowników (ale może być dowolny), daj mi 18 wierszy danych (przez limit, ale może to być prawie dowolna liczba rekordów, ale potrzebujesz tylko od 22 listopada do 6 grudnia, co jest tylko 14 dni, ale zrobiłem 18 tylko dla zasady może to być prawie wszystko. Powyżej tabeli Użytkownicy jest (wybierz @ curDate: = '2012-11-21') sqlvars. Każda instrukcja select w zapytaniu zapakowana w nawiasy jako źródło tabeli musi mieć nadany alias i ponieważ jest to tylko zmienna, której będę używał, nie obchodzi mnie to jaka jest jego nazwa. Tak więc to zapytanie rozpoczyna zmienną 21 listopada i Select @curDate: = Date_Add ... bla bla twierdzi, że bierze aktualną wartość @curDate, dodaje 1 dzień (teraz staje się 22 listopada) i przechowuje go w zwróconym wierszu "MyJoinDate". Tak więc teraz to wewnętrzne zapytanie tworzy twoją tabelę dat z datą 22 do 18 dni i ma alias "AllDaysYouWant" dla reszty zapytania do odniesienia.

Mam dostosowane zapytania, które było prawdopodobnie to, co napotkał, aby alias.field wszystko dla wyjaśnienia ...

+0

Dzięki za odpowiedź.Niestety otrzymuję błąd składni MySQL w pobliżu '1, @curDate) jako MyJoinDate FROM (SELECT @curDate: =' 2 '. – user1883978

+0

@ user1883978, poprawiono ... SQL-Server vs MySQL na datę calc ... zobacz poprawione date_add() content – DRapp

+0

To może być mój kompletny brak wiedzy, jeśli chodzi o bardziej złożone zapytania takie jak to, ale nie mogę sprawić, żeby to zadziałało. Nie jestem pewien co to jest "AllDaysYouWant", a to nie jest "nieznane" kolumna "jeśli spróbuję użyć zapytania tak jak jest. Dzięki za pomoc! – user1883978

1

Co trzeba zrobić
1. Generowanie zakresu dat.
2. Następnie wybierz te daty, których nie ma w tobie, powodujących zapytanie powyżej
3. I wykonaj połączenie z powyższym zapytaniem.

1

Jest pokazując 66 rekordy tylko ja przeszły 120 w granicach

SELECT AllDaysYouWant.MyJoinDate, count(U.id) AS NumberJoined FROM (SELECT @curDate := Date_Add(@curDate , INTERVAL 1 DAY) AS MyJoinDate FROM (SELECT @curDate := '2013-08-03')sqlvars, ipro_user LIMIT 150)AllDaysYouWant LEFT JOIN ipro_user U ON AllDaysYouWant.MyJoinDate = date_format(`date` , '%Y-%m-%d') AND U.active=1 GROUP BY AllDaysYouWant.MyJoinDate 

Query ma błąd, działa dobrze

Powiązane problemy