Query per conteggio record

Salve a tutti!

Spero riusciate ad aiutarmi, vorrei ottenere una cosa di questo tipo: tv lcd [56] lettori dvd [22]

Ho una tabella con 3 campi (menu - sottomenu - e prodotti)

Struttura della tabella `menu`

`id` int(11) NOT NULL AUTO_INCREMENT,

`nome_menu` varchar(50)

Struttura della tabella `sottomenu`

`id` int(11) NOT NULL AUTO_INCREMENT,

`id_menu` text NOT NULL,

`sottomenu` varchar(50)

Struttura della tabella `prodotti`

`id` int(11) NOT NULL AUTO_INCREMENT,

`id_menu` text NOT NULL,

`id_sottomenu` text,

`titolo` text NOT NULL,

So che dovrei fare una query con SELECT COUNT perō non so come dovrei realizzarla, qualcuno potrebbe aiutarmi? GRAZIE!

inviato 6 anni fa
cloude
X 0 X

prova con

SELECT COUNT(id), titolo FROM prodotti GROUP BY titolo

 :bye:

risposto 6 anni fa
Gianni Tomasicchio
X 0 X

Grazie Gianni per la risposta.

Mi resistuisce il conteggio '1' per tutti i sottomenų.

Nella tabella prodotti ho id_menu e id_sottomenu che sono rispettivamente gli id dei campi menu e sottomenu.

Per esempio nella tabella dei prodotti ho:

id_menu     id_sottomenu       titolo

  12                   61                  tv 26"

  12                   61                  tv 26"

  12                   59                  tv 40"

  12                   59                  tv 40"

   

risposto 6 anni fa
cloude
X 0 X

potresti riportare il risultato della query che ti ho suggerito?

risposto 6 anni fa
Gianni Tomasicchio
X 0 X

Allora mettendo la query che mi hai suggerito i sottomenu escono cosė:

tv 26 [1]

tv 40 [1]

lettori dvd [1]

monitor [1]

risposto 6 anni fa
cloude
X 0 X

ma se lanci la query con phpMyAdmin cosa ottieni?

risposto 6 anni fa
Gianni Tomasicchio
X 0 X

ottengo una cosa di questo tipo

count (id)  titolo

2                 tv 26

2                 tv  40

non č quello che dovrei ottenere

perché se ho il sottomenu per esempio televisioni

dovrei ottenere:

televisioni [4]

invece cosė mi fa il conto dei prodotti che hanno lo stesso nome

risposto 6 anni fa
cloude
X 0 X

Quindi vuoi contare quanti prodotti sono associati a ciascun sottomenų?

prova con phpMyAdmin:

SELECT
   COUNT(p.id), s.sottomenu
FROM
   sottomenu s LEFT JOIN prodotti p ON s.id = p.id_sottomenu
GROUP BY s.id

 :bye:

risposto 6 anni fa
Gianni Tomasicchio
X 0 X

Si da phpmyadmin ottengo proprio quello che dicevo  ;D

Perō il problema resta nello script, se metto la stessa query cioč questa:

SELECT

   COUNT(p.id), s.sottomenu

FROM

   sottomenu s LEFT JOIN prodotti p ON s.id = p.id_sottomenu

GROUP BY s.id

e poi stampo il conteggio record cosė: <?php echo $row_rs_count['COUNT(p.id)']; ?>

ottengo su tutti i sottomenų associati  [6]

risposto 6 anni fa
cloude
X 0 X

Facendo in questo modo mi stampa correttamente i sottomenų e il conteggio, ma separatamente,

ma non riesco a far in modo di ottenere il conteggio di fianco al sottomenų correttamente.

<table border="1" cellpadding="1" cellspacing="1">
  <tr>
    <td>sottomenu</td>
  </tr>
  <?php do { ?>
    <tr>
      <td><?php echo $row_rs_sottomenu['sottomenu']; ?></td>
    </tr>
    <?php } while ($row_rs_sottomenu = mysql_fetch_assoc($rs_sottomenu)); ?>
</table>

conteggio


<table border="1" cellpadding="1" cellspacing="1">
  <tr>
    <td>sottomenu</td>
  </tr>
  <?php do { ?>
    <tr>
      <td><?php echo $row_rs_count['COUNT(p.id)']; ?></td>
    </tr>
    <?php } while ($row_rs_count = mysql_fetch_assoc($rs_count)); ?>
</table>
risposto 6 anni fa
cloude
X 0 X

dal codice che hai riportato mi sembra che vengano effettuate 2 query, giusto? Probabilmente ne basta una, oppure bisogna prima mettere in un array associativo il risultato del conteggio dei prodotti per ciascun sottomenu e poi stampare la tabella dei menu, utilizzando l'array per mostrare anche i conteggi

 :bye:

risposto 6 anni fa
Gianni Tomasicchio
X 0 X

Si volevo ottenere il risultato facendone due di query, perché altrimenti mi confondo di pių  :-\

Comunque ho provato a unificare le due cose e putroppo ottengo come dicevo nei precedenti post il conteggio uguale per tutti i sottomenų.

<table border="1" cellpadding="1" cellspacing="1">
  <tr>
    <td>sottomenu</td>
  </tr>
  <?php do { ?>
    <tr>
      <td><?php echo $row_rs_sottomenu['sottomenu']; ?>&nbsp;<?php echo $row_rs_count['COUNT(p.id)']; ?></td>
    </tr>
    <?php } while ($row_rs_sottomenu = mysql_fetch_assoc($rs_sottomenu));
          while ($row_rs_count = mysql_fetch_assoc($rs_count)); ?>
</table>
risposto 6 anni fa
cloude
modificato 6 anni fa
X 0 X

Non puoi chiamare mysql_fetch_assoc due volte cosė come hai fatto nello script.

Ma attualmente quante query vengono fatte per creare il menu?

risposto 6 anni fa
Gianni Tomasicchio
X 0 X

Le query ne sono 2 , una per il sottomenų e una per il conteggio.

<?php
//prima parte con 1a query
mysql_select_db($database_conn, $conn);
$query_rs_sottomenu = "SELECT * FROM sottomenu";
$query_limit_rs_sottomenu = sprintf("%s LIMIT %d, %d", $query_rs_sottomenu, $startRow_rs_sottomenu, $maxRows_rs_sottomenu);
$rs_sottomenu = mysql_query($query_limit_rs_sottomenu, $conn) or die(mysql_error());
$row_rs_sottomenu = mysql_fetch_assoc($rs_sottomenu);


//seconda parte con 2a query
mysql_select_db($database_conn, $conn);
$query_rs_count = "SELECT COUNT(p.id), s.sottomenu FROM sottomenu s LEFT JOIN prodotti p ON s.id = p.id_sottomenu GROUP BY s.id";
$query_limit_rs_count = sprintf("%s LIMIT %d, %d", $query_rs_count, $startRow_rs_count, $maxRows_rs_count);
$rs_count = mysql_query($query_limit_rs_count, $conn) or die(mysql_error());
$row_rs_count = mysql_fetch_assoc($rs_count);
?>
risposto 6 anni fa
cloude
X 0 X

La prima query non fa nulla di particolare quindi puoi tenere solo la seconda

 :bye:

risposto 6 anni fa
Gianni Tomasicchio
X 0 X

Pardon quella era solo una prova a parte con solo i sottomenų perciō la prima query era semplice.

La prima query per stampare i sottomenų č cosė, perché ottengo tutti i sottomenų dopo aver cliccato uno dei menų principali, dunque la prima parte con la 1a query č cosė

<?php
mysql_select_db($database_conn, $conn);
$query_rs_sottomenu = sprintf("SELECT * FROM sottomenu WHERE id_menu = %s ORDER BY sottomenu ASC", GetSQLValueString($colname_rs_sottomenu, "text"));
$rs_sottomenu = mysql_query($query_rs_sottomenu, $conn) or die(mysql_error());
$row_rs_sottomenu = mysql_fetch_assoc($rs_sottomenu);
$totalRows_rs_sottomenu = mysql_num_rows($rs_sottomenu);
?>
risposto 6 anni fa
cloude
modificato 6 anni fa
X 0 X

Lascia solo la prima query, modificandola in questo modo:

SELECT
   COUNT(p.id) as num_prodotti, s.*
FROM
   sottomenu s LEFT JOIN prodotti p ON s.id = p.id_sottomenu
WHERE
   s.id_menu = %s 
GROUP BY s.id
ORDER BY s.sottomenu ASC

 :bye:

risposto 6 anni fa
Gianni Tomasicchio
modificato 6 anni fa
X 0 X

Ottengo questo errore  :-\

Column 'id_menu' in where clause is ambiguous

risposto 6 anni fa
cloude
X 0 X

Sicuro di aver riportato la query esattamente?

risposto 6 anni fa
Gianni Tomasicchio
X 0 X

L'ho sostituita a quella precedente senza muovere altro cosė:

<?php
mysql_select_db($database_conn, $conn);
$query_rs_sottomenu = sprintf("SELECT COUNT(p.id), s.* FROM sottomenu s LEFT JOIN prodotti p ON s.id = p.id_sottomenu WHERE id_menu = %s GROUP BY s.id ORDER BY s.sottomenu ASC", GetSQLValueString($colname_rs_sottomenu, "text"));
$rs_sottomenu = mysql_query($query_rs_sottomenu, $conn) or die(mysql_error());
$row_rs_sottomenu = mysql_fetch_assoc($rs_sottomenu);
$totalRows_rs_sottomenu = mysql_num_rows($rs_sottomenu);
?>
risposto 6 anni fa
cloude
X 0 X

qualcosa perō l'hai cambiata....

la mia:

WHERE s.id_menu = %s

la tua:

WHERE id_menu = %s

notata la differenza?

risposto 6 anni fa
Gianni Tomasicchio
X 0 X

Oddio che sbadato, ora funziona! grazie Gianni!!!

Mi piacerebbe capire il significato della query nel caso in futuro vorrei adoperarla nuovamente, soprattutto il senso logico delle lettere che hai associato prima di ogni campo.

risposto 6 anni fa
cloude
X 0 X

Vediamo un po'...

[tt]FROM sottomenu s LEFT JOIN prodotti p[/tt]

Per le tabelle sottomenu e prodotti, che sto mettendo in JOIN, ho dichiarato degli alias, ovvero dei sinonimi pių brevi, le letterine s e p. Nella query quindi quando vedi quelle lettere significa che mi sto riferendo a campi delle tabelle  sottomenu e prodotti.

Il JOIN č di tipo LEFT, che significa: restituiscimi tutti i record della prima tabella (sottomenu) e incrociali con i record della seconda tabella (prodotti) e se non ci sono prodotti associati ad un sottomenu devi restituirmi comunque il sottomenu! Se avessi fatto un JOIN normale non avremmo visto i sottomenu senza prodotti.

[tt]ON s.id = p.id_sottomenu[/tt]

Il LEFT JOIN va fatto secondo questo criterio: incrocia le righe di sottomenu con quelle di prodotti in modo che il valore di id_sottomenu dei record di prodotti coincida con il valore di id dei record di  sottomenu

[tt]GROUP BY s.id[/tt]

Non restituirmi tutti gli incroci di record delle due tabelle ma solo un incrocio per ciascun sottomenų

[tt]SELECT COUNT(p.id) as num_prodotti, s.*[/tt]

Quando mi restituisci un solo incrocio per sottomenu dammi tutti i dati del sottomenu (s.*) e contami quandi id di prodotti (p.id) hai raggruppato per quel sottomenu, ovvero quanti prodotti hai trovato associati al sottomenu.

 :bye:

risposto 6 anni fa
Gianni Tomasicchio
X 0 X

Non so che dire... grazie mille per la tua disponibilitā e pazienza, questa spiegazione me la stampo  ;D

risposto 6 anni fa
cloude
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda