Query ordinate dividendo in guppi

  • Creatore Discussione Creatore Discussione Monital
  • Data di inizio Data di inizio

Monital

Utente Attivo
15 Apr 2009
778
2
18
Arieccomi

sto utilizzando un menu a cascata dove listo il risultato di una query

supponendo che debba ordinare per cognome ma voglio dividerli in gruppi da 6 con uno da due tipo

A-F ------>A B C D E F
G-L-------->G H I J K L
M-R ---------->M N O P Q R
S-X----------->S T U V X
Y - Z------------>Y Z

cosi quando uno clicca su A- F deve scorrere la lista dei nomi da A a F

potei risolvere con dei like ma dovrei mettere 6 condizioni nella query per 5 query

c' un sistema + sbrigativo?
 
ciao
ho guardato un po' le funzioni stringa applicabili alle select, ma non ho trovato niiente che possa fare il tuo caso.
forse puoi risolvere il problema con php
 
si stavos tudiando qualcosa al riguardo

pensavdi creare 6 variabili con all'interno l'sitruzione LIKE 'A%' LIKE 'B% etc.
 
ciao
non so
sarà perche a e piace più labvorare con php che con mysql io farei tutto in php
tirerei fuori tutti i record e lo passerey un un array, ciclandoli peo con
if primo carattere >=A or <=F stampa
o qualcosa di dimile
 
si potrebbe essere anche un idea.

facendo una cosa del tipo
PHP:
$c = substr($stringa, 0, 1);

dove stringa lo inserisco in un ciclo però quest'estrazione la devo inserire dentro dei menu a comparsa quidni credo che il ciclo diventi un pò troppo complicato per le mie capacità.

Domani vedo di studiare qualcosa e amgari la propongo cosi vediamo un pò
 
mah! sta diventando troppo complesso

avevo iniziato facendo una query tu tutta la tabella e poi contavo le righe.
dividevo le righe per il numero di menu che volevo sul primo livello e lo inserivo in un ciclo
quindi prima
PHP:
$sql = "SELECT * FROM tabella ORDER by Nome";
$rest = mysql_query($sql);
$tot=mysql_num_rows($rest);
$list_menu=$tot/6; //6 gruppi nel menu
poi
PHP:
 <ul>
   <li><a href="#">livello principale</a>
      <ul><?php for($i=1; $i<=$list_menu; $i++){ 
	  	  echo "<li><a href=\"#\">$i</a>"; }?> <ul>
      </ul>
	   </li>
     </ul>
   </li>
   <li>Pannello 2</li>
   <li>Pannello 3</li>
 </ul>

ed diciamo che fin qui ci saremmo pure poi dovrei fare una query sulla prima ed ultima ed estrapolare la prima lettera
quindi una query con LIMIT 0, 6 dove poi dal risultato,dentro un array,mi esteraggo la prima lettera del primoe dell'ultimo elemento
epoi anche la query del limit dovrei cilclarla per far si che nel primo livello mi esca una cos del tipo

A-B
C-F

perchè magari la query mi trova 3 nomi con la A e 2 con la B poi 2 nome con la C e 5 con la F

Insomma un bordello quindi penso mi convenga dare io l'inut al primo livello facendo scegliere i nomi da A a G e via dicendo e nel secondo livellod are la query on base all'iniziale

però qua non saprei come cilcare le elttere quidni fare un for da A a G e fargli fare la query in abse a questo.

Penso che l'unica soluzione sia per l'appunto creare una variabile per ogni blocco del tipo

$X= "Nome LIKE 'A%' AND Nome LIKE 'B%' etc.

e poi inserirla nalla query dio ogni livello

perlomeno con le mie conoscenze queesto è il massimo che riesco ad ottenere
 
ciao
mi è venuto in mente questo anche come detto per operare su mysql non ho travato nulla salvo come dici una sfilza di like.
non l'ho testato, ma il princio dovrebbe essere che se clicchi sul link es a-f ti appaiono solo i nomi che iniziano per a poi b...sino a f compresi
eventualmente provalo e sappimi dire

PHP:
<?php
//..........
$sql = "SELECT Nome FROM tabella ORDER by Nome";
$rest = mysql_query($sql);
$nomi=mysql_fetch_array($rest);//creo l'array nomi
sort($nomi);
//questi poi li metti a posto con i css
echo "<a href=\"?ini=A&fin=F\">A-F</a>";
echo "<a href=\"?ini=G&fin=L\">G-L</a>";
echo "<a href=\"?ini=R&fin=R\">M-R</a>";
echo "<a href=\"?ini=S&fin=X\">S-X</a>";
echo "<a href=\"?ini=Y&fin=Z\">Y-Z</a>";
echo "<a href=\"#\">tutti</a>";
if(isset($_GET['ini'])){
?>
 <ul>
   <li><a href="#">livello principale</a>
      <ul>
<?php
	foreach($nomi as $nome){//ho messo strtoupper perche se per errore il nome è pinco comunque venga fuori come se fosse Pinco
		if(strtoupper($nome[0]) >= $_GET['ini'] && strtoupper($nome[0]) <= $_GET['fin']){
			echo "<li><a href=\"#\">$nome</a>";
		}
	}
?> <ul>
      </ul>
       </li>
     </ul>
   </li>
   <li>Pannello 2</li>
   <li>Pannello 3</li>
 </ul>
<?php
}else{
	//e qui li mostri tutti
}
//.........
?>

edit
scusa fatto un errore correggi la parte di estrazione dalla tabella così
PHP:
<?php
//......
$sql = "SELECT Nome FROM tabella ORDER by Nome";
$rest = mysql_query($sql);
while($riga=mysql_fetch_array($rest)){
	$nomi[]=$riga['Nome'];//creo l'array nomi
}
//.......
?>
 
Ultima modifica:
sti like mi stanno facendo diventar matto altro che LIKE

allora ho provato anche se devo dirla tutta ero perplesso per via del get ini che pressupone che uno clicchi su

e difatti di funzionare funziona ma uno dovrebbe prima cliccare su A-F e poi ritornare sul menu

mentre sto cercando di far sic he quando uno passa con il mouse su A-F si veda la lista da A a F

Con like riescoa farlo funzionare inserendo un LIKE solo al massimo due come aumento il numero nons iv ede più niente.
 
Borgo sei un genio ed io ti vengo subito dietro :D:D:D non in senso biblico eh!! :evil:

Praticamente sulla base della tua intuizione ne ho avuta una io porprio rileggendo la mia stessa risposta.

ho creato due variabili

$ini="A";
$fin="B"

e le ho sostituite con i tuoi GET['ini] e GET['fin'] presenti nel foreach ed è andata :moira::moira:

e lasciando l'href del primo livello con "#"

per il moemnto sembra vada bene

"sembra"
 
ah aggiungo uan cosa che è sempre stata una spina nel fianco

se io assieme al nome voelssia ggiugnergli il cognome come faccio a fare il doppio foreach?
tipo il tuo codice modificato è

PHP:
$sql = "SELECT * FROM TabellaORDER by Nomi";
$rest = mysql_query($sql);
while($riga=mysql_fetch_array($rest)){
    $nomi[]=$riga['Nomi'];//creo l'array nomi
}

			$ini="A"; $fin="F";
		    foreach($nomi as $nome){//ho messo strtoupper perche se per errore il nome è pinco comunque venga fuori come se fosse Pinco
        if(strtoupper($nome[0]) >= $ini && strtoupper($nome[0]) <= $fin){
            echo "<li><a href=\"#\">".$nome."</a>";
        }
    }

ora se voglio aggiungere il cognome quindi

PHP:
			$ini="A"; $fin="F";
		    foreach($nomi as $nome){//ho messo strtoupper perche se per errore il nome è pinco comunque venga fuori come se fosse Pinco
        if(strtoupper($nome[0]) >= $ini && strtoupper($nome[0]) <= $fin){
            echo "<li><a href=\"#\">".$nome."-"$cognome".</a>";
        }
    }

devo richiamare l'array della query con $cognome[]=$riga['Cognome]; ma poi mi si incasina quando vado a fare il foreach che non sono mai e poi dico mai risucito a fare il doppio foreach.
 
ciao
prova così
guarda le alternative
PHP:
<?php
//$sql = "SELECT * FROM Tabella ORDER by Cognomi, Nomi";//alternativa: forse più giusta per un elenco (vedi elenco telefono)
$sql = "SELECT * FROM Tabella ORDER by Nomi";
$rest = mysql_query($sql);
while($riga=mysql_fetch_array($rest)){
    $nome=$riga['Nomi'];
	$nomi[$nome]=$riga['Cognomi'];//creo l'array associativo nome cognome
}

$ini="A"; $fin="F";
foreach($nomi as $nome => $cognome){
	//if(strtoupper($cognome[0]) >= $ini && strtoupper($cognome[0]) <= $fin){//alternativa: forse più giusta per un elenco (vedi elenco telefono)
	if(strtoupper($nome[0]) >= $ini && strtoupper($nome[0]) <= $fin){
		echo "<li><a href=\"#\">$nome - $cognome</a>";
	}
} 
?>
verifica i nomi dei campi
 
Volendo si puo fare anche via query elencando le lettere
Codice:
SELECT * FROM `tabella` WHERE SUBSTR(Nome,1,1) in ('A','B','C','E','F')


Inoltre perché non li stampi direttamente nel while invece di rifare il foreach? Settando ugualmente l'array se ne avrai bisogno dopo
 
Volendo si puo fare anche via query elencando le lettere
Codice:
SELECT * FROM `tabella` WHERE SUBSTR(Nome,1,1) in ('A','B','C','E','F')
Inoltre perché non li stampi direttamente nel while invece di rifare il foreach? Settando ugualmente l'array se ne avrai bisogno dopo

In che senso settarli nel while?

E un menu a tendina a scomparsa a 3 livelli per preisare.

adesso provo la query

comuqnue borgo funziona il tuo script anche se devo ripetere i 7 foreach per ogni riga del secondo livello
 
ciao
comuqnue borgo funziona il tuo script anche se devo ripetere i 7 foreach per ogni riga del secondo livello
perche? certo se usi $ini="A"; $fin="F"; ma se usi il sistema del get ne basta una
anche quella di nefyt può andare bene, però o fai 7 query o ancje li usi un sistema con il get o favendo un form con il post.

@nefyt
considera che è un ragionamento buttato giu qui, e tutti i ragionamenti possono essere affinati in fase di realizzo, data l'idea poi sta anche all'utente migliorarla
 
eh si con il get risolverei ma non voglio far cliccare sopra il secondo livello. il terzo livello si deve aprire solo al passagio del mouse

comunque trattandosi di una pagina sola può andarmi anche bene cosi.

probabilemnte potrei risolvere ciclando le variabili e mettendo nel foreach tutto il menu a tendina.

grazie comunque del supporto.

a dirla tutta il sistema di mettere il cognome come chiave del nome ci sarei dovuto arrivare da solo eprchè avevo (con il vostro aiuto) risolto già una query del genere e che quando mi innervosisco vado nel pallone
 
giusto epr la cronaca ho ridotto i gruppi in 4 cosi ho fatto solo 4 foreach

per il primo livello invece ho isnerito tutto il blocco in un ciclo all'interno del primo<ul><li>

quindi se un domani mi servono al peimo livello 4 colonne basta modificare da 3 a 4 il for

grazie dell'aiuto
 

Discussioni simili