PROBLEMA [MySQL]Ricerca su più tabelle

genny92c

Nuovo Utente
103
6
Salve ragazzi, avrei bisogno di aiuto.
Ho un programma che deve cercare un lotto libero all'interno del DB. Vi spiego meglio: Ho una tabella coltivazioni che ha come colonne tipologia, data inizio, data fine e id del lotto(varchar, date, date,int ).
poi ho una tabella lotti che ha gli id dei lotti e delle serre all'interno delle quali sono contenute (int, int).
Ho bisogno, possibilmente a livello DB, di una query che mi permetta di cercare i lotti che sono disponibili, i quali, cioè risultino non occupati alla data odierna.
Il problema sorge perchè non so come impostare questa query e quali operatori utilizzare, inoltre un ulteriore problema e relativo al dominio: non c'è fatto alcun riferimento all'interno della traccia della necessità di tenere uno storico delle coltivazioni(e di tenere salvate quindi, coltivazioni che vengono sostituite), ma se volessi tenerlo, non saprei come selezionare la tupla più recente tra quelle che risulterebbero per uno stesso lotto e come implementare la ricerca nel DB. Sapete darmi un indirizzo?

Il mio problema sorge dal fatto che non so come cercare sulla combinazione delle due tabelle: devo tener conto della possibilità che un lotto possa essere libero, e quindi non ci siano coltivazioni salvate sul db e devo anche conciliare la ricerca eventuale del lotto la cui coltivazione abbia una data di terminazione inferiore a quella odierna.

Stavo pensando ad una soluzione alternativa in cui, ogni lotto è già salvato nel DB nella tabella coltivazioni( anche se non ci sono coltivazioni presenti) con i campi tipologia, inizio e fine vuoti. Questa soluzione mi permetterebbe di avere più semplicità nella ricerca (anche se non so come verrebbero riconosciuti i campi vuoti rispetto alle operazioni di confronto delle date) ma poi esulerebbe un po' dalle responsabilità che avevo assegnato alla classe entityLotto del mio BCED

P.S. ho dimenticato di specificare che dovrei implementare una soluzione che non faccia uso di query innestate in quanto, in sede di esame, la versione mysql sarà precedente alla versione 4.1 che ha implementato la possibilità di utilizzarle
P.P.S. ciò per cui vi sto chiedendo aiuto non è un esame, è una tracia di esercitazione che stavo provando a svolgere
Grazie mille
 

1nd33d

Utente Attivo
653
279
CPU
Intel i5 3570K @ 4,5Ghz
Dissipatore
Scythe Mugen 2
Scheda Madre
Gigabyte Z77X-UD3H
HDD
Samsung 840 PRO 256GB + Sandisk Ultra 250GB + Sandisk Plus 960GB
RAM
2x8GB Crucial Ballistix Tactical @2000Mhz CL9
GPU
XFX RX480 GTR Black Edition
Audio
Auzentech X-Fi Forte
Monitor
AOC i2369VW
PSU
Seasonic P660
Case
eh?
Periferiche
Razer Naga HEX v2
OS
Windows 10 64bit - Linux Mint 18
Non mi è chiaro come hai strutturato il db, in particolare è confuso il modo in cui definisci (almeno a parole) le entità (coltivazione, lotto e serra).
Meglio se riporti la traccia del problema...
 

genny92c

Nuovo Utente
103
6
Il DB è composto dalle tabelle
Coltivazioni
tipo (varchar20), inizio (date), fine (date), idLotto (int)
Lotti
id (int) e idSerra (int)

Specifico che un determinato lotto può non avere una coltivazione storata, e quindi il join delle tabelle sul campo c.idLotto=l.id non è possibile
Non ho necessità di usare nessun campo della serra per quanto riguarda questa funzione per cui non ti ho riportato la tabella relativa
 

genny92c

Nuovo Utente
103
6
credo di aver risolto.
Se faccio un left joind del genere
SELECT * FROM coltivazioni as c right join lotti as l on l.id=c.idLotto where now()>c.fine or c.fine is null

Stupidamente non avevo pensato ad usare un outer join, così ottengo la vista che volevo ottenere e posso anche lasciare invariatè le responsabilità di ricerca alla classe LottoEntity del mio BCED.

Funziona, ma magari avete suggerimenti più eleganti?
 

1nd33d

Utente Attivo
653
279
CPU
Intel i5 3570K @ 4,5Ghz
Dissipatore
Scythe Mugen 2
Scheda Madre
Gigabyte Z77X-UD3H
HDD
Samsung 840 PRO 256GB + Sandisk Ultra 250GB + Sandisk Plus 960GB
RAM
2x8GB Crucial Ballistix Tactical @2000Mhz CL9
GPU
XFX RX480 GTR Black Edition
Audio
Auzentech X-Fi Forte
Monitor
AOC i2369VW
PSU
Seasonic P660
Case
eh?
Periferiche
Razer Naga HEX v2
OS
Windows 10 64bit - Linux Mint 18
Il join è la soluzione più semplice. L'altra alternativa che mi viene in mente richiede una query annidata.
 
  • Mi piace
Reazioni: genny92c
D

deleted_97382

Ospite
Se riuscissi a metterci la struttura delle tabelle su cui fare join, potremmo aiutarti meglio probabilmente. Così la cosa purtroppo è un po' vaga.
 

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili