Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Weryfikacja zapytań
olo707
post 27.02.2016, 21:33:33
Post #1





Grupa: Zarejestrowani
Postów: 77
Pomógł: 0
Dołączył: 30.03.2012

Ostrzeżenie: (0%)
-----


Witam,

Stworzyłem kilka zapytań które wstępnie sprawdziłem i działają ale będę wdzięczny za jakieś spostrzeżenia, ewentualnie rady w poprawieniu.
Mam dwie tabelki pierwsza to 'users' z kolumnami
id - (oczywiście primary key autoincrement), name, email
druga tabela to 'invoices'z kolumnami
user_id, amount, created_at

Przykładowy wiersz z pierwszej tabeli wygląda tak ; 16 Esther Barton esther.white@wiegand.info
Przykładowy wiersz z drugiej tabeli wygląda tak ; 2180 12.61 2015-06-16

A poniżej co chcę osiągnąć i zapytania;

ile każdego dnia było transakcji
  1. SELECT created_at, COUNT(*) AS countValue FROM invoices GROUP BY created_at ORDER BY created_at DESC


ile każdego dnia było unikalnych użytkowników przeprowadzających transakcję
  1. SELECT COUNT(DISTINCT user_id) AS number, created_at FROM invoices GROUP BY created_at ORDER BY created_at DESC


ile było użytkowników, w każdej domenie mailowej
  1. SELECT DISTINCT (SUBSTRING_INDEX(email, '.', -1)) AS emailSlice, COUNT(id) AS countUsers FROM users GROUP BY (SELECT DISTINCT (SUBSTRING_INDEX(email, '.', -1)))


ile transakcji miał każdy użytkownik
  1. SELECT DISTINCT invoices.user_id, users.name, COUNT(created_at) AS countDate FROM invoices INNER JOIN users ON invoices.user_id = users.id GROUP BY user_id ORDER BY user_id


wszyscy użytkownicy, którzy mają więcej niż 3 transakcje
  1. SELECT invoices.user_id, users.name, COUNT(*) AS countAmount FROM invoices INNER JOIN users ON invoices.user_id = users.id GROUP BY invoices.user_id HAVING COUNT(*) > 3



jaka była średnia wartość transakcji i odchylenie standardowe z ostatnich 7 dni, w których występują transakcje
  1. SELECT ROUND(AVG(total),2) AS avgTotal, ROUND(STDDEV(total),2) AS devTotal FROM (SELECT ROUND(SUM(amount),2) AS total FROM invoices GROUP BY created_at ORDER BY created_at DESC LIMIT 7) AS fromList


Ten post edytował olo707 27.02.2016, 22:11:44
Go to the top of the page
+Quote Post
mmmmmmm
post 27.02.2016, 22:35:43
Post #2





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

Ostrzeżenie: (0%)
-----


  1. SELECT DISTINCT (SUBSTRING_INDEX(email, '.', -1)) AS emailSlice, COUNT(id) AS countUsers FROM users GROUP BY (SELECT DISTINCT (SUBSTRING_INDEX(email, '.', -1)))

źle
powinno być:
  1. SELECT SUBSTRING_INDEX(email, '.', -1) AS emailSlice, COUNT(id) AS countUsers FROM users GROUP BY SUBSTRING_INDEX(email, '.', -1)

lub
  1. SELECT SUBSTRING_INDEX(email, '.', -1) AS emailSlice, COUNT(id) AS countUsers FROM users GROUP BY 1

Gdzie 1 to numer kolumny wynikowej wg ktorej mamy grupować.
  1. SELECT DISTINCT invoices.user_id, users.name, COUNT(created_at) AS countDate FROM invoices INNER JOIN users ON invoices.user_id = users.id GROUP BY user_id ORDER BY user_id

niepotrzebny DISTINCT

Ten post edytował mmmmmmm 27.02.2016, 22:36:14
Go to the top of the page
+Quote Post
kajzur
post 27.02.2016, 22:37:02
Post #3





Grupa: Zarejestrowani
Postów: 385
Pomógł: 26
Dołączył: 22.03.2008
Skąd: TM

Ostrzeżenie: (0%)
-----


Jest ok. Tylko w "wszyscy użytkownicy, którzy mają więcej niż 3 transakcje" używaj w HAVING już policzonego countAmount zamiast robić COUNT'a one more time.


--------------------
Zapraszam na mojego bloga. Dowiedz się jak uzyskać darmowy, zaufany certyfikat albo jak rozpoznawać głos ;)
Go to the top of the page
+Quote Post
olo707
post 28.02.2016, 10:50:19
Post #4





Grupa: Zarejestrowani
Postów: 77
Pomógł: 0
Dołączył: 30.03.2012

Ostrzeżenie: (0%)
-----


dzięki
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 13.06.2025 - 09:45