[MySQL] Conteggio records su tabella relazionata

gbwebapps

Nuovo Utente
30 Giu 2017
7
0
1
51
Salve a tutti.
Sto sviluppando una applicazione di tipo catalogo, con il classico schema di tabelle:

- marche
- prodotti
- categorie
- cat_to_prod (tabella di join)

abbiamo quindi una relazione uno a molti fra le tabelle marche e prodotti
abbiamo poi una relazione molti a molti fra le tabelle categorie e prodotti attraverso la tabella di join cat_to_prod

fin qui tutto ok.

Vorrei adesso effettuare dei calcoli per offrire delle statistiche, specificatamente:
- le prime dieci marche con più prodotti
- le prime dieci categorie con più prodotti

qualcosa tipo:

1) samsung(59)
2) apple (37)
..... oppure ....
1)smartphones(12)
2)tablet(11)

non ho mai fatto questo tipo di elaborazioni, non ho idea nemmeno da dove iniziare.
Volevo chiedere se qualcuno potesse darmi il "la" da dove poter almeno iniziare a studiare.

Grazie a tutti

Giorgio
 

marino51

Utente Attivo
28 Feb 2013
2.912
162
63
Lombardia
supponendo che le tabelle "MARCHE" e "PRODOTTI", contengano un "IDmarca" comune
puoi scrivere,
PHP:
    SELECT t1.marca, count(t2.IDmarca) as counter
      FROM marche t1
RIGHT JOIN prodotti t2
        ON t1.IDmarca = t2.IDmarca
  GROUP BY t1.marca
  ORDER BY counter desc, t1.marca
che estrae la lista delle marche che hanno prodotti collegati quindi con counter > 0
se volessi usare LEFT JOIN, ti estrarrebbe tutte le marche, anche quelle senza prodotti collegati

ORDER BY lo aggiusti secondo necessità, ordine per numero maggiore di prodotti (come esempio)
oppure ordine alfabetico della marca

ho usato t1 e t2 come alias delle tabelle per rendere più facile (credo) applicare il metodo ad altri conteggi

ps, l'estrazione dei primi 10 dipende dal database usato,
per mysql devi usare la clausola LIMIT
per mssql vale la clausola TOP
 
Ultima modifica:

gbwebapps

Nuovo Utente
30 Giu 2017
7
0
1
51
Ciao, funziona perfettamente!

L'ho trasformato secondo le mie esigenze così:

public function count_brands()
{
$sql = 'SELECT brands.brand, count(products.brand_id) as counter
FROM brands
RIGHT JOIN products
ON brands.id = products.brand_id
GROUP BY brands.brand
ORDER BY counter DESC, brands.brand';

$query = $this->db->query($sql);

return $query->result();
}

ed anche la parte apparentemente più complessa visto che richiama una parte di join, funziona allo stesso modo:

public function count_categories()
{
$sql = 'SELECT categories.category, count(categories_to_product.product_id) as counter
FROM categories
RIGHT JOIN categories_to_product
ON categories.id = categories_to_product.product_id
GROUP BY categories.category
ORDER BY counter DESC, categories.category';

$query = $this->db->query($sql);

return $query->result();
}


Ti ringrazio molto.

p.s. sai consigliarmi un libro esaustivo e moderno su MYSQL/SQL

Grazie

Giorgio