[PHP] Selezionare ultimo campo ed escludere doppioni

samurai.sette

Utente Attivo
17 Dic 2015
235
6
18
Ciao a tutti.
Vi vorrei chiedere una cosa.
Ipotizziamo di avere una tabella mysql con "x" colonne che contiene molti valori duplicati in una colonna. Volendo estrarre da questa tabella tutti i valori ed escludere i duplicati dovremmo scrivere un qualcosa del genere:
Codice:
SELECT DISTINCT colonna FROM tabella ORDER BY colonna;
Facendo in questo modo mi estrae tutte le prime righe dei valori della tabella escludendo i doppioni.
La domanda è questa: se invece di estrarre tutti i primi valori volessi estrarre tutti gli ultimi valori ed escludere gli altri, come dovrei scrivere?
Se scrivo:
Codice:
SELECT DISTINCT colonna FROM tabella ORDER BY colonna DESC
mi estrae solo ed esclusivamente l'ultimo valore.
Consigli?
Ciao, grazie
 
ciao, dovresti essere un pò più preciso, quanti valori voui estrarre? devi avere un range, non puoi dire a mysql estrai i primi valori ed escludi gli altri.
 
Ciao Monital. Se non c'è Borgo Italia ci sei tu ad aiutarmi.
Ti faccio un esempio pratico per spiegarmi.

TABELLA Mysql

id || data || lettura

1 || 19-08-2016 || 0.13
2 || 19-08-2016 || 0.11
3 || 19-08-2016 || 0.12
4 || 19-08-2016 || 0.15
5 || 20-08-2016 || 0.17
6 || 20-08-2016 || 0.14
7 || 20-08-2016 || 0.18
8 || 21-08-2016 || 0.14
9 || 21-08-2016 || 0.19
10 || 21-08-2016 || 0.20

Se scrivessi
Codice:
SELECT DISTINCT data FROM tabella ORDER BY data ASC;
otterrei questi dati:
19-08-2016
20-08-2016
21-08-2016

Attenzione! Facendo in questo modo il dato 19-08-2016 è riferito al rigo 1, il dato 20-08-2016 è riferito al rigo 5 e il dato 21-08-2016 è riferito al rigo 8.
Quello che chiedevo era: invece di estrarre il dato 19-08-2016 dal rigo 1 è possibile estrarlo dal rigo 4 escludendo i doppioni? (stessa cosa per 20-08-2016 e 21-08-2016)
Ciao
 
Ultima modifica:
te la butto là perchè non ho modo ora di testare ma credo funzioni, sperando di non dire una corbelleria
PHP:
SELECT DISTINCT data,
(SELECT MAX(id) FROM tabella) AS Maxdata FROM tabella ORDER BY data ASC

nel mentre prova poi vedo di testarla
 
Ciao Monital. Grazie, funziona alla perfezione.
Posso farti una domanda? (spero di non scocciarti troppo e perdona la mia ignoranza sul php, so che devo ancora imparare tantissimo)
Ricordi il progettino che mi hai aiutato a fare qualche giorno fa? Pensavo di unirlo a questo ma ho un piccolo problemuccio. Invece di estrarmi le date e i corrispondenti id (escludendo i doppioni come ho detto prima) mi estrae solo ed esclusivamente il valore più grande dalla tabella (id=10).
Ho fatto in questo modo
Codice:
<?php
$con = mysql_connect ("localhost", "root","") or die ("Connessione al server fallita! ".mysql_error());
$db = mysql_select_db ("database", $con) or die ("Connessione al database fallita! ".mysql_error());
$sql="SELECT DISTINCT data, (SELECT MAX(id) FROM tabella) AS max FROM tabella ORDER BY data ASC";
$result = mysql_query($sql);
while($righa=mysql_fetch_assoc($result)){
$max_id=$righa['max'];
echo '<option value="'.$max_id.'">'.$righa['data'].'</option>';
}
$con = mysql_close();
?>
Credo di aver fatto un casino dopo la query... perchè tutti i valori li inserisce correttamente all'interno della drop-down box ma dopo che scelgo il valore e clicco il bottone mi tira fuori sempre l'id più grande.
Secondo te dove sbaglio?
Ciao, grazie.
 
scusa samurai, nessun fastidio ma non capisco cosa vuoi fare inq uella drop
 
Ciao Monital.
1) Nella drop inserisco le date eliminando i doppioni nel modo che ho descritto prima.
2) L'utente sceglie la data a suo piacimento, clicca un bottone e viene estratto l'id che sarà scritto in una input text.
Ciao.
 
al posto di
PHP:
echo '<option value="'.$max_id.'">'.$righa['data'].'</option>';
metti
PHP:
echo '<option value="'.$righa['id'].'">'.$righa['data'].'</option>';
 
Ciao Monital.
Avevo già provato a fare in questo modo, ma non mi funziona.
Per spiegarmi ti posto subito il codice che ho scritto
Codice:
<body>
<form method="post" action="">
    <select class="" name="variabile">
<?php
$con1 = mysql_connect ("localhost", "root","") or die ("Connessione al server fallita! ".mysql_error());
$db1 = mysql_select_db ("database", $con1) or die ("Connessione al database fallita! ".mysql_error());
$sql1="SELECT data, id FROM tabella GROUP BY data ASC";
$result1 = mysql_query($sql);

while($row1=mysql_fetch_array($result1)){
echo '<option value="'.$row1['id'].'">'.$row1['data'].'</option>';
}
$con1 = mysql_close();
$con2 = mysql_connect ("localhost", "root","") or die ("Connessione al server fallita! ".mysql_error());
$db2 = mysql_select_db ("database", $con2) or die ("Connessione al database fallita! ".mysql_error());
$sql2="SELECT DISTINCT data, (SELECT MAX(id) FROM tabella) AS max FROM tabella ORDER BY data ASC";
$result2 = mysql_query($sql2);
while($righa=mysql_fetch_assoc($result2)){
echo '<option value="'.$righa2['id'].'">'.$righa2['data'].'</option>';
}
$con2 = mysql_close();
?>
</select>
<input type="text" name="prova" readonly="readonly" value="<?php echo   (!$_POST['variabile']) ? '' : $_POST['variabile'];?>"/>
<input name="submit" type="submit" value="submit" />
<br />
<br />
</form>
</body>
In questo codice tutta la parte che riguarda $con1 funziona perfettamente; quindi il php si connette, seleziona i primi valori di "data e id" dalla tabella escludendo i doppioni, fa la query,effettua un ciclo while e scrive con una echo il valore dell'id e chiude la connessione di $con1.
Il codice $con2 è identico a $con1 ma funziona in parte; in questo caso il php mi inserisce all'interno della drop tutti i valori della data escludendo i doppioni (fin qui è OK). Se scelgo un valore e clicco il bottone non mi scrive il relativo id :mad:, eppure il codice è quasi identico a $con1.
Il php è bellissimo ma a volte mi fa proprio arrabbiare :mad::mad:
Secondo te dove può essere il problema?
Ciao.
 
ho rivisto un pò il codice, si effettivamente nonf a quello e non può farlo perchè selezionando un distinct sul max id ti restituirà sempre quello massimo. forse ho capito male io quello che volevi fare

sostituisci
PHP:
SELECT DISTINCT data, (SELECT MAX(id) FROM tabella) AS max FROM tabella ORDER BY data ASC

con

PHP:
SELECT DISTINCT data,id FROM tabella WHERE id=(SELECT MAX(id) FROM prova) ORDER BY data ASC"

l'ho testato e funziona.

ti consiglio comuqnue di cambiare metodo di connessione usando PDO o msqli

p.s. poi non serve che apri più connessioni ti faccio un esempio

PHP:
<body>
<form method="post" action="">
    <select class="" name="variabile">
<?php
$db = new mysqli($DBhost, $DBuser, $DBpass, $DBName);
if ($db->connect_errno) {
    die('Connect Error: ' . $db->connect_errno);
}
$sql="SELECT data, id FROM prova GROUP BY data ASC";
$result = $db->query($sql);
  while($row = $result->fetch_array(MYSQLI_ASSOC)){
echo '<option value="'.$row['id'].'">'.$row['data'].'</option>';
}

$sql="SELECT DISTINCT data,id FROM prova WHERE id=(SELECT MAX(id) FROM prova) ORDER BY data ASC";
$result = $db->query($sql);
  while($row = $result->fetch_array(MYSQLI_ASSOC)){
echo '<option value="'.$row['id'].'">'.$row['data'].'</option>';
}
?>
</select>
<input type="text" name="prova" readonly="readonly" value="<?php echo   (!$_POST['variabile']) ? '' : $_POST['variabile'];?>"/>
<input name="submit" type="submit" value="submit" />
<br />
<br />
</form>
</body>
 
Ciao Monital.
Ho provato il tuo codice e funziona quasi alla perfezione. Ti spiego riportandoti la tabella di prima.
TABELLA Mysql

id || data || lettura

1 || 19-08-2016 || 0.13
2 || 19-08-2016 || 0.11
3 || 19-08-2016 || 0.12
4 || 19-08-2016 || 0.15
5 || 20-08-2016 || 0.17
6 || 20-08-2016 || 0.14
7 || 20-08-2016 || 0.18
8 || 21-08-2016 || 0.14
9 || 21-08-2016 || 0.19
10 || 21-08-2016 || 0.20

Con questa parte di codice
Codice:
$sql="SELECT DISTINCT data,id FROM tabella WHERE id=(SELECT MAX(id) FROM tabella) ORDER BY data ASC";
$result = $db->query($sql);
  while($row = $result->fetch_array(MYSQLI_ASSOC)){
echo '<option value="'.$row['id'].'">'.$row['data'].'</option>';
}
il php mi inserisce all'interno del drop-down box soltanto l'ultima data più grande (rigo 10) e mi esclude le altre (rigo 7, rigo 4).
Invece mi deve inserire queste date:
== 21-08-2016 (id 10)
== 20-08-2016 (id 7)
== 19-08-2018 (id 4)
Per il resto funziona alla perfezione.

Per quanto riguarda il metodo di connessione (PDO o mysqli), questi sono due argomenti che devo approfondire ma vorrei fare un passo alla volta.
Sul numero di connessioni che ho fatto, hai perfettamente ragione. Ma l'ho fatto per un semplicissimo motivo: volevo soltanto dividere il codice in due blocchi per mia comodità e una volta terminato utilizzare una sola connessione come hai fatto tu per poi chiuderla alla fine.
 
Ciao Monital.
Solo una domanda: con l'ultimo codice che mi avevi scritto, il php mi estraeva soltanto l'id più grande (id=10) in quanto non potevo selezionare gli altri valori dal drop-down box.
A questo punto mi chiedevo: secondo te con il php in questa situazione posso soltanto estrarre il primo valore (id=1) e l'ultimo valore (id=10) e scordarmi degli altri? (id=4 e id=7)
Ciao.
 
allora riguardo il penultimo post il codice postatof a quello che avevi chiesto in precedenza ora non capsico cosa vuoi fare ancora. per l'ultima richiesta
Codice:
SELECT MIN(id) AS min, MAX(id) AS max FROM tabella
 
Ciao Monital. Grazie per i tuoi continui aiuti. Questo è sempre quello che ho voluto fare, solo che sicuramente non ho saputo esprimermi bene e ti chiedo scusa.
Ho provato il codice che mi hai scritto ma nel drop-down box oltre alle date con id più piccolo (id=1;id=5;id=8) mi inserisce solo una riga completamente bianca. Quindi le date con id più grande non le posso scegliere (id=4;id=7;id=10).
Questo è il codice che ho scritto
PHP:
<body>
<form method="post" action="">
    <select class="" name="variabile">
<?php
$con1 = mysql_connect ("localhost", "root","") or die ("Connessione al server fallita! ".mysql_error());
$db1 = mysql_select_db ("database", $con1) or die ("Connessione al database fallita! ".mysql_error());
$sql1="SELECT data, id FROM tabella GROUP BY data ASC";
$result1 = mysql_query($sql1);

while($row1=mysql_fetch_array($result1)){
echo '<option value="'.$row1['id'].'">'.$row1['data'].'</option>';
}

$sql2="SELECT data, MAX(id) AS max FROM tabella";
$result2 = mysql_query($sql2);
while($riga=mysql_fetch_array($result2)){
echo '<option value="'.$riga['id'].'">'.$riga['data'].'</option>';
}
$con1 = mysql_close();
?>

</select>
<input type="text" name="prova" readonly="readonly" value="<?php echo   (!$_POST['variabile']) ? '' : $_POST['variabile'];?>"/>
<input name="submit" type="submit" value="submit" />
<br />
<br />
</form>
</body>
Secondo te dove sbaglio?
Ciao.
 
Ultima modifica di un moderatore:
ciao
intanto se dai un alias (AS) ad un campo

$sql2="SELECT data, MAX(id) AS max FROM tabella";

poi devi richiamarlo col suo alias

echo '<option value="'.$riga['max'].'">'.$riga['data'].'</option>';
 
ciao
poi se usi l'ozione MAX (oppure MIN che è lo stesso) non puoi dargli da estrarre anche i dati di altre colonne in quanto il valore risultante è unico
quindi se vuoi estrarre un altra colonna corrispondente al MAX o al MIN devi fare due select es. schematico
PHP:
<?php
//dati connessione ecc.....
$q=mysql_query("SELECT max(id) as max, MIN(id) as min FROM tabella");
while($riga=mysql_fetch_assoc($q)){
    $max=$riga['max'];
    $min=$riga['min'];
}
$q=mysql_query("SELECT id, data FROM tabella WHERE id=$min OR id=$max ORDER BY data ASC");//o DESC
//<select...>
while($riga=mysql_fetch_assoc($q)){
    $id=$riga['id'];
    $data=$riga['data'];
    echo "<option value='$id'>$data</option>";//ottieni solo due option
}
//</select> ecc....
?>
o, forse, poi ricorrere ad una subquery (da mysql 4 ), comunque da provare
PHP:
$q="SELECT * FROM tabella WHERE id=(SELECT min(ID) FROM tabella) OR id=(SELECT max(ID) FROM tabella)";
ottenebdo però solo due option come prima
 

Discussioni simili