[PHP] Selezione record da elenco

Max61

Utente Attivo
2 Mar 2014
705
3
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.392
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.020
174
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
705
3
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
            [email protected]_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
705
3
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.020
174
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
705
3
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.020
174
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
705
3
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
705
3
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: 118

marino51

Utente Attivo
28 Feb 2013
3.020
174
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
705
3
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.020
174
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
705
3
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
T fatture con voci fattura in php PHP 0
T ALTRO PROBLEMA CON ARRAY PHP PHP 1
M Collegamento tra form html e script php PHP 4
M Problemi con la stampa dei valori in php PHP 1
W [Cerco collaborazioni] Sviluppatore Web (PHP) Offerte e Richieste di Lavoro e/o Collaborazione 0
D passare valori da database sql a php PHP 1
L Ricezione dei dati su file php da modulo html PHP 6
E Inviare variabile a PHP da ciclo in JS Javascript 0
A form PHP prenotazione tramite query PHP 2
A Form php prenotazione di un azienda sanitaria locale presso studio medico PHP 1
F menù select dinamico da db in php PHP 3
L Problemi form Pagina php HTML e CSS 3
L php mysql non salva solo id PHP 21
L php mysql cerca e visualizza pagina PHP 0
F Il codice php è giusto? PHP 2
R Aggiornare record mysql con Ajax, jQuery e php Ajax 2
A invio massivo dati a file php Javascript 4
Z MySql injection PHP PHP 1
V PHP form intersecate PHP 0
I [Offro][Retribuito] Programmatore Php Offerte e Richieste di Lavoro e/o Collaborazione 0
P Funzione jQuery Ajax invio file a php jQuery 1
C Dopo chiusura del tag php la stringa html va a capo PHP 1
E Transaction php PHP 11
B ciclare file xml con PHP PHP 1
L Estrazione dati php Database 6
A Aiuto per pagina php PHP 0
E Php select option e ajax PHP 23
I Aiuto php Dependent Lookup PHP 0
T arretramento versione PHP... PHP 3
D problema php mysql PHP 1
D problema php mysql PHP 1
E Barra di avanzamento codice PHP PHP 4
G creazione menu a tendina e invio a pagina php PHP 1
A inserire variabile php colore in div html PHP 2
Z Video protetto con PHP PHP 0
Z Problema di sincronizzazione PAYPAL con PHP PHP 1
I Eecuzione di javascript in ciclo foreach php. PHP 7
S Libreria PHP per creare file dwg o dxf PHP 0
A [cerco - retribuito] Sviluppatore Php freelance per progetti vari Offerte e Richieste di Lavoro e/o Collaborazione 2
L Google chart php mysql PHP 2

Discussioni simili