[RISOLTO] Creazione database

marcoint

Utente Attivo
8 Gen 2014
58
0
0
Salve ragazzi per un progetto vorrei creare un database formato essenzialmente da 2 tabelle. Una con le date ed un'altra con gli eventi correlati a quelle date. Ovviamente ci sarà una relazione 1 a n. Avete suggerimenti su come fare? Perchè non posso mettermi a scrivere tutte le date dell'anno perchè poi questo database lo dovrei richiamare da un form che ad una data ( scelta da una listbox) farà uscire tutti gli eventi presenti. Spero di essere stato chiaro il problema è che ad esempio ci sono eventi che avvengono in tutta l'estate e l'utente scegliendo 12 agosto deve vedere anche quelli compresi li.
Ps: oltre alla creazione se possibile mi fareste vedere una eventuale query da usare..
Grazie in anticipo.
 
Ciao,
per gestire gli eventi, basta una sola tabella. Ipotizza la seguente tabella:

Codice:
evento_tit			evento_desc	evento_da	evento_a
Concerto FestivalBar 2014	(Excluded)	20130801	20130901
Grigliata di Ferragosto		(Excluded)	20130815	20130815

effettuando la seguente query, riesci a recuperare tutti gli eventi attivi a ferragosto, sia quelli di una sola giornata, sia quelli che durano un intero mese compreso il giorno indicato (20130815)

SELECT evento_tit, evento_desc, evento_da, evento_a FROM tb_eventi
WHERE 20130815 between evento_da and evento_a

la tabella calendario non serve perchè solitamente da html si usa l'oggetto input date che fornisce tutte le date del calendario

Ciao
Mik


A quick solution is a shortcut to troubleshooting
HolidaySoft.it - Gestionali, Database, SitiWeb
GarganoSapori.it - Olio ExtraVergine del Gargano
OsteriaORistorante.it - Crea la Vetrina per il tuo Ristorante!
 
Ultima modifica:
Ciao grazie mille per avermi risposto. E' esattamente quello che intendevo. Ho alcuni dubbi però. A cosa serve il campo evento_desc? Cioè lo devo mettere nella mia tabella e settarlo sempre escluded ma a che serve? Poi quella query se ho ben capito funziona per la data singola, ma sul mio sito ho bisogno che, attraverso un form con due listbox che indica gli eventi che ci sono tra quelle due date, faccia uscire gli eventi disponibili. In questo caso bisogna cambiare la query? Grazie mille per aver risposto, attendo un tuo ulteriore aiuto :)
 
Ciao,
evento_desc è un campo che puoi utilizzare per inserire la descrizione dell'evento... niente di chè, era solo per fare un esempio pratico.
Per quanto riguarda invece il discorso "Intervallo di date", con la seguente query puoi interrogare eventi con data singola o range di date:

Ipotizziamo sempre una tabella così valorizzata:
Codice:
evento_tit			evento_desc	evento_da	evento_a
Concerto FestivalBar 2014	desc_1		20130801	20130901
Settimana di Ferragosto		desc_2		20130812	20130814
Grigliata di Ferragosto		desc_3		20130815	20130815

se voglio sapere tutti gli eventi attivi nel periodo 20130811 - 20130830 utilizzo la query:

SELECT evento_tit, evento_desc, evento_da, evento_a FROM tb_eventi
WHERE ( 20130811 >= evento_da AND 20130811 <= evento_a)
OR ( 20130830 >= evento_da AND 20130830 <= evento_a)
OR (20130811<=evento_da AND 20130830>=evento_a)

che prenderà in considerazione:
- eventi di una giornata compresi nel periodo 20130811 - 20130830, quindi Grigliata di Ferragosto 20130815 20130815
- eventi con intervallo di date superiore a quello interrogato 20130811 - 20130830 ma comunque con intersezione nel periodo interessato, quindi Concerto FestivalBar 2014 20130801 20130901
- eventi con intervallo di date all'interno di quello interrogato 20130811 - 20130830, quindi Settimana di Ferragosto 20130812 20130814

Credo che la query sopra indicata copra tutti i casi...

Ciao
Mik


A quick solution is a shortcut to troubleshooting
HolidaySoft.it - Gestionali, Database, SitiWeb
GarganoSapori.it - Olio ExtraVergine del Gargano
OsteriaORistorante.it - Crea la Vetrina per il tuo Ristorante!
 
Sisi ho risolto, mi sono dimenticato di scriverlo. Grazie mille a holiday ed a flameseeker che mi ha aiutato in privato.
 
Non mi sono minimamente accorto del post che avevi creato, comunque marcoint ti invito ad esporre la soluzione che hai trovato, per completare la discussione e renderla di utilità anche, eventualmente, per altre persone ;)
 
La query che ho usato e che funziona è questa:

Codice:
$sql="SELECT EVENTO FROM tb_eventi INNER JOIN tb_date ON tb_date.ID=tb_eventi.IDK WHERE DATAINIZIO <= '$dateEventiFINO' AND DATAFINE >= '$dateEventiDA'";

Ho preferito questa a quella di holiday ( che comunque funziona ) solo per brevità :) Grazie ancora a tutti e due.
 
Fai attenzione, credo che con la tua query riesci a coprire solo la prima casistica delle tre esposte da me...
Non proprio Holiday, gli ho suggerito quella soluzione lì proprio perché fa tutte e 3 le cose.

Riprendendo gli esempi che hai portato:
- eventi di una giornata compresi nel periodo 20130811 - 20130830, quindi Grigliata di Ferragosto 20130815 20130815
Codice:
'20130815' <= '20130830' AND '20130815' >= '20130811'
True And True

- eventi con intervallo di date superiore a quello interrogato 20130811 - 20130830 ma comunque con intersezione nel periodo interessato, quindi Concerto FestivalBar 2014 20130801 20130901
Codice:
'20130801' <= '20130830' AND '20130901' >= '20130811'
True And True

- eventi con intervallo di date all'interno di quello interrogato 20130811 - 20130830, quindi Settimana di Ferragosto 20130812 20130814
Codice:
'20130812' <= '20130830' AND '20130814' >= '20130811'
True And True


Fosse in te, userei anche un record ID autoincrement al fine di identificare sempre univocamente ogni singolo evento.
Condivido in pieno anche il suggerimento di felino.
 
Ciao flameseeker,
prova a vedere questi esempi.. è probabile anche che mi sbagli io... ma è meglio confrontarsi:

ESEMPIO A
Codice:
data_da		data_a
20130812	20130814

mio risultato:
Codice:
ev_tit	evento_da	evento_a
A	20130801	20130901
B	20130812	20130814


tuo risultato - errore: l'evento A passa per il periodo interrogato (evento attivo) ma con la tua query non viene visualizzata
Codice:
ev_tit	evento_da	evento_a
B	20130812	20130814


ESEMPIO B
Codice:
data_da		data_a
20130815	20130815

mio risultato:
Codice:
ev_tit	evento_da	evento_a
A	20130801	20130901
C	20130815	20130815


tuo risultato - errore: l'evento A passa per il periodo interrogato (evento attivo) ma con la tua query non viene visualizzata
Codice:
ev_tit	evento_da	evento_a
C	20130815	20130815


ESEMPIO C
Codice:
data_da		data_a
20130815	20130902

mio risultato:
Codice:
ev_tit	evento_da	evento_a
A	20130801	20130901
C	20130815	20130815


tuo risultato - errore: l'evento A passa per il periodo interrogato (evento attivo per circa 15 gg del periodo) ma con la tua query non viene visualizzata
Codice:
ev_tit	evento_da	evento_a
C	20130815	20130815

Mi sbaglio??

Grazie
Ciao


A quick solution is a shortcut to troubleshooting
HolidaySoft.it - Gestionali, Database, SitiWeb
GarganoSapori.it - Olio ExtraVergine del Gargano
OsteriaORistorante.it - Crea la Vetrina per il tuo Ristorante!
 
Ciao flameseeker,
prova a vedere questi esempi.. è probabile anche che mi sbagli io... ma è meglio confrontarsi:

Può essere che non tengo conto di qualcosa, provo a seguirti nei ragionamenti, fammi sapere se ho capito male qualche passaggio.
Premetto che parlo per logica (quindi non sto testando su un database di prova).


ESEMPIO A
Codice:
data_da		data_a
20130812	20130814
Allora, prendo queste come date di riferimento per definire il range temporale che mi interessa selezionare.

mio risultato:
Codice:
ev_tit	evento_da	evento_a
A	20130801	20130901
B	20130812	20130814

Le condizioni che ho sviluppato usando i riferimenti che esponi sarebbero, concettualmente, formulabili così:
Codice:
evento_da <= data_a AND evento_a >= data_da

Per l'evento A, quindi otterrei
Codice:
'20130801' <= '20130814' AND '20130901' >= '20130812'
20130801 è minore di 20130814
E
20130901 è maggiore di 20130812

Qui mi sembra di esserci.

Per l'evento B
Codice:
'20130812' <= '20130814' AND '20130814' >= '20130812'
20130812 è minore di 20130814
E
20130814 è maggiore di 20130812

Mi trovo anche qui.


ESEMPIO B
Codice:
data_da		data_a
20130815	20130815

Quindi range di riferimento una giornata precisa.

mio risultato:
Codice:
ev_tit	evento_da	evento_a
A	20130801	20130901
C	20130815	20130815

Per l'evento A, quindi otterrei
Codice:
'20130801' <= '20130815' AND '20130901' >= '20130815'
20130801 è minore di 20130815
E
20130901 è maggiore di 20130815

Mi trovo anche qui.

L'evento C:
Codice:
'20130815' <= '20130815' AND '20130815' >= '20130815'
20130815 è uguale a 20130815
E
20130815 è uguale a 20130815

Ci sono ancora.


ESEMPIO C
Codice:
data_da		data_a
20130815	20130902

Ok, nuovo riferimento temporale.

mio risultato:
Codice:
ev_tit	evento_da	evento_a
A	20130801	20130901
C	20130815	20130815

L'evento A:
Codice:
'20130801' <= '20130902' AND '20130901' >= '20130815'
20130801 è minore di 20130902
E
20130901 è maggiore di 20130815

Quindi viene recuperata.

Evento C
Codice:
'20130815' <= '20130902' AND '20130815' >= '20130815'
20130815 è minore di 20130902
E
20130815 è uguale a 20130815

Mi trovo anche qui infine.



Se c'è qualcosa che non quadra nella mia logica, onestamente, non sono riuscito a vederlo.
Qualcuno degli esempi che ho posto ti risulta essere errato ?
 

Discussioni simili