- Home
- Categorie
- Coding e Sistemistica
- MYSQL e altri Database
- ricerca in MySql
-
ricerca in MySql
Ciao a tutti,
non so come fare una ricerca in una table MySql.
Non è la solita ricerca, ovviamente per meIn un record viene settato un flag.
Quello che vorrei fare è leggere i record partendo da quello con il flag fino all'ultimo della table.
Una qualche idea?
Grazie
Joshua
-
Ciao Joshua Whopper,
dovresti fare una query per recuperare il record con il flag, e un'altra per recuperare tutti i record a partire da quello, puoi utilizzare le subquery.
-
Purtroppo non sono molto ferrato (eufemismo) nelle subqueries.
Ti do una indicazione se ti può essere utile per aiutarmi.
Ogni record contiene un campo data_operazione e pensavo di basarmi su quello, una volta individuato il record di partenza, ma come ho detto sopra...Ciao
Joshua
-
Volendo puoi pure fare 2 query separate come ti ho detto sopra.
Mentre la guida alle subquery la puoi trovare qui:
http://dev.mysql.com/doc/refman/5.1/en/subqueries.html
Non è nulla di complicato.
-
Grazie. Mi studierò le subqueries.
-
Ciao Joshua Whopper, non ho ben capito di cosa necessiti e cosa intendi per flag.
In pratica hai:
id - flag - dati variVuoi recuperare tutte le righe, partendo da quelle con il flag?
Supponendo che il flag sia un numero e che se non sia "flaggato", flag valga 0 oppure NULL.In questo caso basta una normale query:
SELECT * FROM tabella ORDER BY flag DESC, id DESCPrende tutte le tuble e in testa mette quelle con il flag.
Oltre a ordinarle per flag, sono anche ordinate mettendo in cima le ultime inserite (a parità di flag).Saluti
-
Ciao Bazarop,
la situazione di base è quella da te descritta
In pratica hai:
id - flag - dati variIl flag, che è un numero 0 = off, 1 = settato, si trova in una tupla qualsiasi della relazione/tabella e ce ne è uno solo settato.
Vorrei riuscire a leggere tutte le tuple partendo da quella flaggata fino all'ultima.
Il problema, secondo me, è che le tuple dopo quella flaggata NON sono flaggate.
-
Credo di voglia semplicemente un left join, mi mostri un esempio di tabelle popolate con 3-4 valori per piacere ?
-
Il problema, secondo me, è che le tuple dopo quella flaggata NON sono flaggate.
Ciao, non vorrei mettere carne a cuocere, ma in futuro sei sicuro che non possano esserci più di un record con flag a 1
Perchè con questa query basterebbe anche un solo flag in più e la stessa non funzionerebbe, pensaci
Ciao da danny
-
Ciao,
la relazione viene aggiornata dall'utente che può solo aggiungere nuove tuple. Oltre a leggere il tutto, ovviamente.
L'inserzione di nuovi domini/campi NON prevede il set/reset del famoso flag.L'aggiornamento del flag (set/reset) viene fatto da un cosidetto admin utilizzando un altro script che gli consente di leggere tutte le tuple partendo da quella con il flag settato fino all'ultima della relazione. Dopo di che il flag esistente viene resettato e ne viene settato uno sull'ultima tupla della relazione.
Giusto per provare a chiarire
Data 2012-01-01 ....dati vari.... flag=1 ..... flag=0 Data 2012-01-17....dati vari..... flag=0 ```Vengono lette ed elaborate tutte le tuple a partire da 2012-01-01 fino alla fine della relazione (e.g. 2012-01-17) Al termine del tutto la situazione della relazione sarà
Data 2012-01-01 ....dati vari.... flag=0
..... flag=0
Data 2012-01-17....dati vari..... flag=1E' vero che potrebbero esserci mismatch per cui l'utente inserise una nuova tupla mentre l'admin fa le elaborazioni, ma questa è un'altra storia, al momento vorrei riuscire a leggere quelle benedette tuple partendo da quel benedetto flag :)
-
Nell'esempio che mi hai mostrato, NON ESISTONO RELAZIONI.
Le relazioni esistono tra più tabelle, nel tuo caso hai una sola tabella e non vedo come possano esserci relazioni, per quello la richiesta era poco chiara.Ti avevo già scritto la select da utilizzare. Non capisco perchè non vada bene.
Vuoi una select che ti restituisca tutte le tuple, ordinate per data , ma con in cima quella con il flag.
Ti riscrivo la select:SELECT * FROM tabella ORDER BY flag DESC, data ASC
-
Ho utilizzato il termine relazione perchè nel mio lavoro quelle che usualmente si chiamano table vengono identificate come relazioni, le tuple sono i record e i domini sono i campi. Deformazione professionale.
Quanto alla soluzione da te proposta, ad onor del vero, sulla carta non mi convinceva molto ma ora che tempo e possibilità di provarla lo farò e ti farò
sapere.
-
Ho fatto una prova utilizando il tuo suggerimento
"hardcopy" è il campo che contiene la flag$result = mysqli_query($db, "SELECT * FROM $db_table ORDER BY hardcopy DESC, data ASC"); while ($row = mysqli_fetch_array($result)) { echo $row['data'], $row[....]; }
Quello che vedo è la prima tupla avente il flag settato poi tutte le tuple della relazione ordinate dal 2010-01-01 all'ultima
Utilizzando
$result = mysqli_query($db, "SELECT * FROM $db_table WHERE hardcopy = '1' ORDER BY hardcopy DESC, data ASC"); while ($row = mysqli_fetch_array($result)) { echo $row['data'], $row[....]; }
vedo solo la tupla on il flag settato.
-
Quello che vedo è la prima tupla avente il flag settato poi tutte le tuple della relazione ordinate dal 2010-01-01 all'ultima
Non era quello di cui avevi bisogno?
Tupla con flag in testa e di seguito le altre ordinate per data.PS: Se inserisci hardcopy = '1', ovviamente quelle non flaggate non vengono prese.
-
Mi sa che proprio non riesco a farmi capire
Proviamo così
Supponi che nella relazione ci siano 100 tuple, per comodità supponiamo che la tupla flaggata sia la #85.
Lo script deve trovare la tupla flaggata e da li leggere le altre fino alla 100 mai quelle prima perchè sono già state lette in una sessione precedente.Per cercare di essere ancora più chiaro ti ripropongo l'esempio delle 13:53 leggermente modificato
Data 2011-01-01.....vari dati.....flag=0 ........ Data 2011-10-26 .... vari dati.... flag=0 Data 2011-10-27......vari dati ...**.flag=1** Data 2011-10-27......vari dati.....flag=0 (possono esserci date uguali ma eventualmente solo una tupla avrà il flag settato) ....... Data 2011-11-17....vari dati.....flag=0 (temporanea fine della relazione) [1]
Per cui la ricerca deve iniziare dalla tupla con flag settato e terminare alla tupla con Data 2011-11-17 ignorando completamente quelle precedenti a quella avente il flag settato.
Al termine della elaborazione la situazione della relazione diventerà
Data 2011-01-01.....vari dati.....flag=0 ........ Data 2011-10-26 .... vari dati.... flag=0 Data 2011-10-27......vari dati ...**.**flag=0 Data 2011-10-27......vari dati.....flag=0 ....... Data 2011-11-17....vari dati.....**flag=1** ```E la relazione è pronta per essere letta nuovamente, supponiamo il giorno 2011-12-03, partendo dalla tupla avente il flag settato che questa volta avrà come *Data 2011-11-17* e terminerà all'ultima tupla che nel nostro esempio avrà data *2011-12.03 * fiuuuu.... spero di avercela fatta :smile5: [1] temporanea perchè poi l'utente potrà e dovrà inserire nuovi dati che verranno letti successivamente
-
Ahh, scusa, non avevo proprio capito.
SELECT * FROM table WHERE data>=(SELECT data FROM table WHERE flag =1) ORDER BY data ASC
-
Questo mi piace
Lo provo e ti faccio sapere
-
FUNZIONA!!!!!!
PerfettoGrazie infinite
-
Figurati. Scusami, ma proprio non avevo capito.