[MySQL] Join, Count e Order (ASC & DESC)...

RedWarrior

Nuovo Utente
17 Giu 2009
15
0
1
Salve a tutti.
Ho 2 tabelle:
- noleggi (id, data, gioco, socio);
- giochi (di cui mi interessa solo il campo nome e numscaff per metterlo in relazione con l'altra tabella).

Ciò che vorrei visualizzare da queste due tabelle è, in pratica, una tabella html con la classifica settimanale dei giochi più noleggiati.
Il problema nasce nel momento in cui vado a inserire nei <th></th> della tabella due link che modifichino l'ordine dei risultati.
Per essere più chiaro posto il codice che ho realizzato finora:
Codice:
<body>
<?php
include_once('conn.php');
$order = $_GET['order'] != "" ? $_GET['order'] : "class";
$az = $_GET['az'] != "" ? $az : "DESC";
?>
<h2>CLASSIFICA SETTIMANALE</h2>
</div>
<table>
<tr>
 <th>N&deg;</th>
 <th><a href="statsett.php?order=ns">Numero Scaffale</a><br /><a href="statsett.php?order=ns&az=ASC"><img src="img/up.png" alt="ASC"/></a>&nbsp;&nbsp;&nbsp;<a href="statsett.php?order=ns&az=DESC"><img src="img/down.png" alt="DESC"/></a></th>
 <th><a href="statsett.php?order=gioco">Gioco</a><br /><a href="statsett.php?order=gioco&az=ASC"><img src="img/up.png" alt="ASC"/></a>&nbsp;&nbsp;&nbsp;<a href="statsett.php?order=gioco&az=DESC"><img src="img/down.png" alt="DESC"/></a></th>
 <th><a href="statsett.php?order=class">Noleggi</a><br /><a href="statsett.php?order=class&az=ASC"><img src="img/up.png" alt="ASC"/></a>&nbsp;&nbsp;&nbsp;<a href="statsett.php?order=class&az=DESC"><img src="img/down.png" alt="DESC"/></a></th>
 </tr>
 
<?php




$x_pag = 25;

// Recupero il numero di pagina corrente.
// Generalmente si utilizza una querystring
$pag = isset($_GET['pag']) ? $_GET['pag'] : 1;

// Controllo se $pag è valorizzato e se è numerico
// ...in caso contrario gli assegno valore 1
if (!$pag || !is_numeric($pag)) $pag = 1;


// Uso mysql_num_rows per contare il totale delle righe presenti all'interno della tabella
$all_rows = mysql_num_rows(mysql_query("SELECT noleggi.gioco AS ns, COUNT(*) AS class, giochi.nome AS gioco FROM noleggi INNER JOIN giochi ON giochi.numscaff = noleggi.gioco WHERE DATE_SUB(CURDATE(),INTERVAL 7 DAY) <= data GROUP BY gioco ORDER BY $order $az"));

// Tramite una semplice operazione matematica definisco il numero totale di pagine
$all_pages = ceil($all_rows / $x_pag);

// Calcolo da quale record iniziare
$first = ($pag - 1) * $x_pag;

// Recupero i record per la pagina corrente...
// utilizzando LIMIT per partire da $first e contare fino a $x_pag
$rs = mysql_query("SELECT noleggi.gioco AS ns, COUNT(*) AS class, giochi.nome AS gioco FROM noleggi INNER JOIN giochi ON giochi.numscaff = noleggi.gioco WHERE DATE_SUB(CURDATE(),INTERVAL 7 DAY) <= data GROUP BY gioco ORDER BY $order $az LIMIT $first, $x_pag");
$nr = mysql_num_rows($rs);
if ($nr != 0){

  for($x = 0; $x < $nr; $x++){
    $row = mysql_fetch_assoc($rs);
       
       
$id=$row['id'];
$nr = mysql_num_rows($rs);


?>
  <tr>
     <td><??></td>
     <td><?=$row['ns'];?></td>
   <td><?=$row['gioco']; ?></td>
   <td><?=$row['class']; ?></td>
  </tr>
   
<?php
}
}
?>
</table>


<div id="pgs">
<?php
if ($all_pages > 1){
  if ($pag > 1){
    echo "<a href=\"" . $_SERVER['PHP_SELF'] . "?id=".$id."&pag=" . ($pag - 1) . "\">";
    echo "<img src='img/left.png' alt=''></a>&nbsp;";
  }
  // faccio un ciclo di tutte le pagine
  for ($p=1; $p<=$all_pages; $p++) {
    // per la pagina corrente non mostro nessun link ma la evidenzio in blod
    // all'interno della sequenza delle pagine
    if ($p == $pag) echo "<b>" . $p . "</b>&nbsp;";
    // per tutte le altre pagine stampo il link
    else {
      echo "<a href=\"" . $_SERVER['PHP_SELF'] .  "?id=".$id."&pag=". $p . "\">";
      echo $p . "</a>&nbsp;";
    }
  }
  if ($all_pages > $pag){
    echo "<a href=\"" . $_SERVER['PHP_SELF'] .  "?id=".$id."&pag=" . ($pag + 1) . "\">";
    echo "<img src='img/right.png' alt=''></a>";
  }
}
?>
</body>

Chiedo scusa se non lo spezzetto, ma credo che visto nel suo insieme risulti più chiaro.
Richiamando la pagina 'statsett.php' la tabella viene visualizzata correttamente, in ordine decrescente per 'class' (ovvero il conteggio), ma se clicco sui link dei <th></th> non succede nulla, eccezion fatta per il <th>NOLEGGI</th> che me lo riordina in maniera crescente (ma non in decrescente).

Qualche anima pia che mi aiuta a capire dove sto sbagliando?
 
Ultima modifica:
-.-' non si può bestemmiare vero? una giornata intera a guardarlo e riguardarlo per capire il problema e poi mi scordo un GET...
cmq ora funziona! Grazie mille Marino51!
 
visto che ormai ci sono... sapreste suggerirmi un metodo per aggiungere al <tr></tr> relativo a <th>N°</n> la posizione in 'classifica'? Ovvero che mi restituisce una sorta di numero di righe risultante dal COUNT (non il totale, ma il numero riga)?
e ovviamente questo dovrebbe restare tale anche ordinando la tabella per nome o ns...
 
non so bene quanti elementi devi visualizzare nella tabella, ma hai valutato la possibilità di ordinare per ogni colonna ?
PHP:
    <script src="../js/jquery.min.js"></script>
    <script src="../js/jquery.tablesorter.js"></script>
    <script type="text/javascript">
    $(document).ready(function() { $("#OPTable").tablesorter(); });
    </script>


        <div class='OPTableDiv'>
          <table id="OPTable" class="tablesorter" border=4 cellpadding=4>
            <?php print $tabella; ?>
          </table>
        </div>
potresti crearti la tabella in php e poi demandare gli ordinamenti al click sul titolo della colonna
uso questa tecnica in diverse applicazioni e mi sono tolto il pensiero dell'ordine
in questo modo rendi più semplice la programmazione
e non devi ricaricare la pagina ad ogni ordinamento diverso
 
Si, probabilmente hai ragione, infatti ti copio lo script per applicazioni future :D. Questo però non risolve il problema della colonna N. che in pratica deve visualizzare il posto del gioco in classifica, indipendentemente dall'ordinamento (p. es. Tetris è il quarto in classifica perché tramite il count(*) è venuto fuori che tre giochi sono stati noleggiati più volte di lui, quindi il numero nella colonna N di Tetris deve essere 4 anche se la tabella è ordinata per nome ASC e quindi è tra gli ultimi ad essere visualizzato). Spero di essermi spiegato.
 
Ho risolto applicando lo script di marino51, che ringrazio nuovamente! (Ero un po' riluttante a modificare quanto avevo fatto, anche perché pensavo sarebbe stato più complicato adattare lo script al mio php... per fortuna mi sbagliavo)
 

Discussioni simili