[PHP] Selezione record da elenco

Max61

Utente Attivo
2 Mar 2014
740
4
18
Salve e Buon Anno a Tutto il Forum.
Adesso passiamo al problema, ho una serie di nominativi che quest'anno hanno avuto un incarico, siccome questo incarico è pluriennale e ogni volta devono essere incaricati con nuovi contratti e altri parametri che saranno diversi di anno in anno le soluzioni secondo me sono due:
1)cancellare tutti i nominativi e reinserire quelli che accettano
2)duplicare i nominativi e inserire l'anno e i parametri relativi alla prestazione
io ho optato per la seconda (perchè ho già la maggior parte dei dati) richiamando i nominativi e in modifica cambiare l'anno della prestazione e altri parametri e reinserirli nel db modificati, così avrò lo stesso nominativo con dati diversi, per accedere alla prestazione dell'anno in corso filtro per anno e fin qui tutto ok.
Vorrei che quando modifico un nominativo dall'elenco dell'anno precedente questo una volta reinserito con l'anno nuovo mi sparisse dall'elenco, per far ciò ho fatto la query sotto, ma va bene soltanto se una persona ha 2 record, infatti mi mostra soltanto quelli che hanno un record nel db, se ce ne sono 3 o più lo vedo lo stesso.
PHP:
$query = "SELECT id, Rilevatore, Indirizzo, Mail, Telefono, Cellulare, tipo, stato, tipoincarico, deter_incarico, fam_ass, Anno

FROM tblrilevatori
where(Rilevatore = '', Indirizzo, Cellulare, tipo, tipoincarico, deter_incarico, fam_ass, Anno) IN(select Rilevatore, Indirizzo, Cellulare, tipo, tipoincarico, deter_incarico, fam_ass, Anno
FROM tblrilevatori
group by Rilevatore having count(*) != 2 )
ORDER BY Rilevatore";
Mi sapete dare una dritta?
Grazie
Max61
 

Max 1

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
29 Feb 2012
4.449
338
83
@Max61
.7 E' vietato aprire discussioni con titoli generici del tipo "Aiuto", "Help" o "Rispondete subito". Alle discussione deve essere assegnato un titolo che ne renda immediatamente comprensibile il contenuto utilizzando, ove possibile, la giusta terminologia tecnica. Così facendo si rende più facile agli altri utenti il compito di trovare immediatamente le discussioni a cui parteciapre.
Come vedi il regolamento del forum vieta titoli come il tuo!
Pertanto ti invito a modificare il titolo della discussione e leggere attentamente il regolamento del forum e il regolamento della sezione dove apri la discussione, cosa che avresti già dovuto fare considerato che sei iscritto dal 2014
 

marino51

Utente Attivo
28 Feb 2013
3.203
207
63
Lombardia
@Max61, mi é difficile comprendere cosa vuoi ottenere,
perché la query che proponi é errata come sintassi ed anche come logica
non ha senso selezionare più colonne (campi) e raggruppare per uno solo di essi ( vedi select inclusa nella clausola IN )

ti suggerisco di provare la query separando le sue componenti, aggiungendo anche le info necessarie per valutare il risultato
in particolare isolando la subquery "IN", prova ad eseguire
Codice:
  select Rilevatore, Indirizzo, Cellulare, tipo, tipoincarico, deter_incarico, fam_ass, Anno, count(*)
    FROM tblrilevatori
group by Rilevatore, Indirizzo, Cellulare, tipo, tipoincarico, deter_incarico, fam_ass, Anno
  having count(*) > 0
order by 1, 2, 3, 4, 5, 6, 7, 8, 9
e valuta il risultato
 

Max61

Utente Attivo
2 Mar 2014
740
4
18
Hai ragione marino51 non è comprensibile se non a me che l'ho scritto. Provo a spiegarmi: ho un elenco di nomi che hanno accettato un incarico e vorrei riutilizzare queste informazioni senza dover stare a riscrivere da capo tutte le informazioni delle persone, per far ciò con una select dove seleziono l'anno 2018 come parametro visualizzo i nomi che hanno partecipato l'anno scorso, vado in modifica del nominativo che ha accettato l'incarico anche per quest'anno e vado a modificare alcuni campi, per esempio l'anno, che è il parametro che mi fa visualizzare i record per l'anno in corso, infatti io entro nell'edizione 2019 usando questa query e passo il valore selezionato alla pagina successiva
PHP:
Scegli l'anno </label>
<?php
  $Query1="SELECT *
FROM tblrilevatori_censimento
WHERE Anno <> 0
GROUP BY Anno
ORDER BY Anno";
        //esecuzione della query
            $Leggi_Anno=@mysql_query($Query1) or die (mysql_error());
       if(!$Leggi_Anno)
         print("<H2>Query fallita!</H2>");
       else
       echo "<select name='Anno' id='Annoid'>";//Genera casella a discesa
       echo "<option value =''>seleziona</option>";//valore vuoto
       while ($row = mysql_fetch_array($Leggi_Anno))
{
$Anno = $row['Anno'];
echo "<option value =\"$Anno\">$Anno </option>"; //Popola casella
}
echo "value=$Anno </select>";
Es.:
Pippo ...Anno incarico 2018
Pluto ...Anno incarico 2018
Minnie...Anno incarico 2018
accettano l'incarico nell'anno in corso:
Pippo ...Anno incarico 2019
Minnie...Anno incarico 2019
Ora vorrei che dopo aver modificato i dati del nominativo selezionato questo sparisse dall'elenco, nell'esempio specifico dovrebbero sparire Pippo e Minnie e rimanesse soltanto Pluto e così via via per tutti i nominativi che accettano l' incarico nell'anno in corso, in modo da mantenere uno storico diciamo.
Con la speranza di essermi spiegato...

Ho provato la query e mi restituisce tutti i nominativi, in quanto nel db di prova i record anche quelli con gli stessi nomi hanno e avranno un anno diverso, perchè sarà così e quindi il conteggio è sempre 1
 
Ultima modifica:

Max61

Utente Attivo
2 Mar 2014
740
4
18
Il fatto è che non vorrei cancellare i record relativi agli anni precedenti, così da avere uno storico
 

marino51

Utente Attivo
28 Feb 2013
3.203
207
63
Lombardia
prova così,
Codice:
   SELECT *
     FROM @tblrilevatori A
LEFT JOIN @tblrilevatori B
       ON A.Rilevatore = B.Rilevatore
      AND A.Incarico   = B.Incarico
      AND B.ANNO = 2019
    WHERE B.Rilevatore is null
      AND B.Incarico   is null
 order by A.Rilevatore, A.Incarico, A.Anno

questo é il risultato (ho usato solo 2 campi, ma puoi estendere come serve)

upload_2019-1-4_22-17-13.png


puoi eliminare
AND B.Incarico is null
lasciando il test solo sul rilevatore, anche se aggiungi altri campi

ps, non usare la "@" davanti al nome della tabella, perché identifica una tabella temporanea per fare le mie prove
 
Ultima modifica:

Max61

Utente Attivo
2 Mar 2014
740
4
18
Ciao Marino51, ho provato la query che hai postato, su localhost mi esclude i record che hanno anni diversi, quindi credo che ci siamo, invece da php mi da questo errore 'Cannot detect primary key'
Grazie
 

marino51

Utente Attivo
28 Feb 2013
3.203
207
63
Lombardia
potrebbe essere che la select con * estragga i campi due volte, la prima dalla tabella A e la seconda dalla B
generando quindi un nome (chiave) doppio, definisci tutti i campi, riposto la query
Codice:
   SELECT A.Rilevatore, A.Incarico, A.Anno
     FROM @tblrilevatori A
LEFT JOIN @tblrilevatori B
       ON A.Rilevatore = B.Rilevatore
      AND A.Incarico   = B.Incarico
      AND B.ANNO = 2019
    WHERE B.Rilevatore is null
 ORDER BY A.Rilevatore, A.Incarico, A.Anno
 

Max61

Utente Attivo
2 Mar 2014
740
4
18
Ciao e grazie, adesso non posso provare, però ho provato a sostituire * con id e Rilevatore e mi dava questo errore 'id ambiguous', quindi mi sa che hai fatto centro. Appena posso lo provo e ti rispondo. Ciao
 

Max61

Utente Attivo
2 Mar 2014
740
4
18
Ciao Marino51, purtroppo stesso errore 'Cannot detect primary key', provo ad allegarti la struttura della tabella.
Ah una cosa, nelle prove su localhost se metto l'anno 2018 mi estrae i record del 2019 e viceversa...io avrei bisogno del contrario.
Grazie di nuovo
Max61
 

Allegati

  • tblrilevatori.zip
    811 bytes · Visite: 317

marino51

Utente Attivo
28 Feb 2013
3.203
207
63
Lombardia
Es.:
Pippo ...Anno incarico 2018
Pluto ...Anno incarico 2018
Minnie...Anno incarico 2018
accettano l'incarico nell'anno in corso:
Pippo ...Anno incarico 2019
Minnie...Anno incarico 2019
Ora vorrei che dopo aver modificato i dati del nominativo selezionato questo sparisse dall'elenco, nell'esempio specifico dovrebbero sparire Pippo e Minnie e rimanesse soltanto Pluto

upload_2019-1-6_13-45-33.png


Non é più così la tua richiesta ?
Per favore fai un esempio della nuova richiesta


se metto l'anno 2018 mi estrae i record del 2019 e viceversa...io avrei bisogno del contrario.

del contrario del viceversa o cosa ??????
(l'italiano é una lingua difficile da capire ha troppe varianti)


purtroppo stesso errore 'Cannot detect primary key'

per favore posta codice, e la segnalazione completa dell'errore in modo da capire l'origine
 
Ultima modifica:

Max61

Utente Attivo
2 Mar 2014
740
4
18
Ciao, la mum richiesta è sempre la stessa"Es.:
Pippo ...Anno incarico 2018
Pluto ...Anno incarico 2018
Minnie...Anno incarico 2018
accettano l'incarico nell'anno in corso:
Pippo ...Anno incarico 2019
Minnie...Anno incarico 2019
Ora vorrei che dopo aver modificato i dati del nominativo selezionato questo sparisse dall'elenco, nell'esempio specifico dovrebbero sparire Pippo e Minnie e rimanesse soltanto Pluto e così via via per tutti i nominativi che accettano l' incarico nell'anno in corso", io intendevo questo: per duplicare i record dell'anno precedente faccio una select passandogli l'anno, ed è qui che quando seleziono il nominativo che accetta l'incarico su modifica del record gli cambio l'anno e quando ritorno nell'elenco da cui sono partito (elenco con parametro anno precedente non vorrei vedere il nominativo a cui ho cambiato l'anno nell'anno corrente).
Es.:
Pippo anno 2018
Pluto anno 2018
Minnie anno 2018

Pippo accetta, quindi nella tabella avrò stesso nominativo ma con anni diversi.
Io a questo punto vorrei che Pippo non sia nell'elenco pur passando la query con il parametro 2018.
 

marino51

Utente Attivo
28 Feb 2013
3.203
207
63
Lombardia
Io a questo punto vorrei che Pippo non sia nell'elenco pur passando la query con il parametro 2018.
il risultato della mia query non comprende ne Pippo ne Minnie ma solo Pluto come da te voluto
upload_2019-1-6_14-12-54.png

forse che nella tabella hai anche anni precedenti e ti serve selezionare solo il 2018 ??????
Codice:
   SELECT A.Rilevatore, A.Incarico, A.Anno
     FROM @tblrilevatori A
LEFT JOIN @tblrilevatori B
       ON A.Rilevatore = B.Rilevatore
      AND A.Incarico   = B.Incarico
      AND B.ANNO > 2018
    WHERE B.Rilevatore is null
      AND A.ANNO = 2018
 ORDER BY A.Rilevatore, A.Incarico, A.Anno
in questo modo selezioni il 2018 e verifichi la presenza negli anni successivi al 2018 passando 1 solo parametro

oppure stai parlando di un'altra query ??
 

Max61

Utente Attivo
2 Mar 2014
740
4
18
Nella tabella per ora ho il 2018, ma se riesco nell'intento vorrei mantenere lo storico da utilizzare per gli anni a venire
 
Discussioni simili
Autore Titolo Forum Risposte Data
M [PHP] Selezione da menu a discesa con 2 variabili PHP 0
Tommy03 [PHP] Errore query selezione avg PHP 0
W [PHP] Come far funzionare un form di selezione PHP 12
U [PHP] Selezione con menu a tendina e recupero selezione PHP 5
E [PHP] selezione automatica lingua PHP 14
S [PHP] Selezione dati con riferimento ad altra colonna tabella PHP 22
L Problema con lettura dati da selezione multipla in php PHP 8
M selezione con checkbox php mysql PHP 14
SolidSnake4 cancella modifca con php con selezione PHP 14
C [php] caselle di selezione 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
D PHP leggere cartella di Windows PHP 1
I dominio aruba versione php server linux Domini 3
G Colorare menu select attraverso ricerca php PHP 0
L PHP motore di ricerca nel sito PHP 1

Discussioni simili