[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
 

Monital

Utente Attivo
15 Apr 2009
778
2
18
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.
 

samurai.sette

Utente Attivo
17 Dic 2015
235
6
18
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:

Monital

Utente Attivo
15 Apr 2009
778
2
18
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
 

samurai.sette

Utente Attivo
17 Dic 2015
235
6
18
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.
 

Monital

Utente Attivo
15 Apr 2009
778
2
18
scusa samurai, nessun fastidio ma non capisco cosa vuoi fare inq uella drop
 

samurai.sette

Utente Attivo
17 Dic 2015
235
6
18
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.
 

Monital

Utente Attivo
15 Apr 2009
778
2
18
al posto di
PHP:
echo '<option value="'.$max_id.'">'.$righa['data'].'</option>';
metti
PHP:
echo '<option value="'.$righa['id'].'">'.$righa['data'].'</option>';
 

samurai.sette

Utente Attivo
17 Dic 2015
235
6
18
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.
 

Monital

Utente Attivo
15 Apr 2009
778
2
18
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>
 

samurai.sette

Utente Attivo
17 Dic 2015
235
6
18
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.
 

samurai.sette

Utente Attivo
17 Dic 2015
235
6
18
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.
 

Monital

Utente Attivo
15 Apr 2009
778
2
18
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
 

samurai.sette

Utente Attivo
17 Dic 2015
235
6
18
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:

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
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>';
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
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
Autore Titolo Forum Risposte Data
M [PHP] Selezionare immagini directory non presenti in db PHP 11
S [PHP] selezionare colonna tabella utilizzando un array PHP 1
S [PHP] Selezionare i campi non in comune con le altre colonne della tabella PHP 4
L [PHP] CHECKBOX DA SELEZIONARE IN UNA TABELLA PHP 4
S [PHP] selezionare colonne in comune con un altra tabella PHP 5
G [PHP] Selezionare OGGI anno precedente per query sql PHP 2
A [RISOLTO] PHP Selezionare tutti i file con stessa estensione PHP 2
S [PHP] Selezionare dati in intervallo di tempo PHP 21
gandalf1959 Selezionare un intervallo tra due date, php e mysql PHP 2
M [PHP] selezionare dati da db e fare confronti PHP 0
L [PHP] selezionare righe di una tabella con le checkbox e cancellarle PHP 2
S [PHP] Selezionare tutte le colonne meno due PHP 6
L [php e mysql] selezionare sia i selezionati e i non selezionati PHP 1
M Tabella PHP con sorgente dati csv: selezionare le riche e compilare Form eMail PHP 1
F Cerco Hosting con VECCHIE versioni di php Hosting 0
Cosina Captcha php PHP 1
S passare un valore da un form a un file .php con metodo post PHP 4
N php msyql PHP 6
N php problemi a visualizzare video PHP 3
A menu a tendina php PHP 1
D protezione cartelle: blocco visualizzazione/scaricamento contenuto, ma abilitazione utilizzo dati da parte di file .php presenti sul sito Web Server 1
F Php date_diff PHP 1
K [PHP] Aggiungere caratteri ad una stringa in base alla lunghezza della stessa PHP 2
C Wp-admin a file php WordPress 5
Lino80 [Retribuito] Cerco programmatore php per modifica/inserimento funzione/valori da un plugin importer wordpress Offerte e Richieste di Lavoro e/o Collaborazione 0
csi Inviare file jpg in locale alla stampante con php PHP 0
M Passaggio variabili array php su un tasto jq PHP 3
E Php aggiornamento tabella PHP 9
G phpmailer e php 8.1 con estensione mysqli PHP 6
M Invio dati database via email php PHP 0
K [php] Problema con inner join PHP 4
K [php]form invio dati PHP 0
P Codifica caratteri speciali mysql php PHP 0
K [PHP] Problema con variabili concatenate. PHP 1
E Stampante termica escpos-php PHP 6
JeiMax Modifica codice php personalizzato PHP 2
G Come modificare un pdf in php PHP 1
U Link a doppio file PHP PHP 0
E PHP & jQuery PHP 8
N Passare array da php a javascript PHP 5
F Applicazione PHP/MySQL per prenotazioni: limitare il numero massimo di posti prenotabili PHP 20
L tipo boolean non funzionante su mariadb (mysql). E codice php 7.4. PHP 0
U PHP creare un file excel dopo ricerca nel DB PHP 0
M PHP/MySQL - Estrarre valori min e max di ogni gruppo PHP 5
F Php e fatturazione elettronica PHP 0
P lanciare script asp (o php) da jquery Javascript 1
Couting95 inserire dati da un file di testo in una tabella in php PHP 1
P Data scraping in PHP non funziona PHP 4
C Calcoli matematici in php PHP 5
F Scrivere dei dati in word con php PHP 0

Discussioni simili