[PHP] Selezione record da elenco

Max61

Utente Attivo
2 Mar 2014
678
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.246
324
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
 

Max 1

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
29 Feb 2012
4.246
324
83

marino51

Utente Attivo
28 Feb 2013
2.912
162
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
678
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
            $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
678
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
2.912
162
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
678
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
2.912
162
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
678
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
678
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

marino51

Utente Attivo
28 Feb 2013
2.912
162
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
678
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
2.912
162
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
678
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