Lekérdezés több sorral való megfeleltetéssel
Adatbázis lekérdezés egy olyan táblából, ahol a gyakorlatban használt "tábla" minden sora cellánként van külön letárolva, de egyszerre több kapcsolódó sornak az adott oszlopa kell, hogy megfeleljen a feltételeknek.
Sziasztok!
Olyan problémába ütköztem, hogy :
- adott egy adattábla:
Ahol data_id megmutatja, hogy mely cellák tartoznak egy sorba,
Ahol field_id megmutatja, hogy a sor melyik cellájához tartozik az érték,
Ahol id a cella egyedi értéke,
Ahol a tabla_id megmutatja, hogy melyik táblába tartozik az adott bejegyzés,
Ahol valodi_ertek megadja az adott cella értékét,
Ahol statusz_1, statusz_2 egyéb paraméterek, amik a példában nem lényegesek.
Ebből a következő feltételeknek megfelelően kell lekérni adatokat:
- ahol tabla_id = 12 ÉS
- (ahol field_id = xx ÉS valodi_ertek = yy) ÉS
- (ahol field_id = bb ÉS valodi_ertek = zz)
és ezeket egy ilyen tömbben kell visszaadni, lehetőség szerint egyetlen sql lekérdezés eredményét feldolgozva (ezt a részt már megoldottuk):Az adatok megszerzéséhez rendelkezésünkre áll az
- tabla_id, valamint
- olyan hármasok, melyek megadják a field_id-t, az ahhoz tartozó feltételt (=, >, <, stb), és a feltételnél az adott field_id+tabla_id pároshoz tartozó valodi_ertek megfelelést. Csak ÉS feltételek lehetnek (tehát field_id1 = 'szöveg' ÉS field_id2 = "masik szoveg", a 12-es tabla_id-vel jelölt sorokban.
Addig, amíg csak egy feltétel van (tehát egy field_id1 = 'szöveg'), addig ez gond nélkül megvalósítható, de amint va negy field_id2 = 'masik szoveg'), akkor már két különböző sorban kell keresnünk az adatbázisban (minden sor egy cellája a virtuális táblázat egy sorának, amelyet data_id-vel jelzünk).
Milyen megoldás ötletetek van?
Jelenleg úgy működik a rendszer, hogy lekéri az adott tabla_id-hez tartozó összes data_id értéket, ezeken végigmenve, lekéri az összes cellát, azokat egy tömbbé alakítja, és ezek után php segítségével végez feltétel ellenőrzést, ami nem éppen gazdaságos egy nagyobb adattáblánál, és rengeteg felesleges lekérdezéssel jár.
MS.
■ Sziasztok!
Olyan problémába ütköztem, hogy :
- adott egy adattábla:
id | field_id | data_id | tabla_id | valodi_ertek | statusz_1 | statusz_2 |
---|---|---|---|---|---|---|
1 | 8 | 111 | 12 | SZÖVEG TARTALOM | 0 | 1 |
2 | 1 | 111 | 12 | MÁS SZÖVEG TARTALOM | 1 | 0 |
3 | 9 | 111 | 8 | ÚJABB SZÖVEG TARTALOM | 0 | 1 |
4 | 1 | 111 | 12 | ISMÉT VALAMI MÁS SZÖVEG TARTALOM | 1 | 1 |
Ahol data_id megmutatja, hogy mely cellák tartoznak egy sorba,
Ahol field_id megmutatja, hogy a sor melyik cellájához tartozik az érték,
Ahol id a cella egyedi értéke,
Ahol a tabla_id megmutatja, hogy melyik táblába tartozik az adott bejegyzés,
Ahol valodi_ertek megadja az adott cella értékét,
Ahol statusz_1, statusz_2 egyéb paraméterek, amik a példában nem lényegesek.
Ebből a következő feltételeknek megfelelően kell lekérni adatokat:
- ahol tabla_id = 12 ÉS
- (ahol field_id = xx ÉS valodi_ertek = yy) ÉS
- (ahol field_id = bb ÉS valodi_ertek = zz)
és ezeket egy ilyen tömbben kell visszaadni, lehetőség szerint egyetlen sql lekérdezés eredményét feldolgozva (ezt a részt már megoldottuk):
ARRAY
[data_id] = ARRAY[
[field_id] = ARRAY[
[field_id]
[data_id]
[tabla_id]
[valodi_ertek]
[statusz_1]
[statusz_2]
[field_id] = ARRAY[
[field_id]
[data_id]
[tabla_id]
[valodi_ertek]
[statusz_1]
[statusz_2]
[field_id] = ARRAY[
[field_id]
[data_id]
[tabla_id]
[valodi_ertek]
[statusz_1]
[statusz_2]
]
[kovetkezo_data_id] = ARRAY[
[field_id] = ARRAY[
[field_id]
[data_id]
[tabla_id]
[valodi_ertek]
[statusz_1]
[statusz_2]
[field_id] = ARRAY[
[field_id]
[data_id]
[tabla_id]
[valodi_ertek]
[statusz_1]
[statusz_2]
[field_id] = ARRAY[
[field_id]
[data_id]
[tabla_id]
[valodi_ertek]
[statusz_1]
[statusz_2]
]
]
- tabla_id, valamint
- olyan hármasok, melyek megadják a field_id-t, az ahhoz tartozó feltételt (=, >, <, stb), és a feltételnél az adott field_id+tabla_id pároshoz tartozó valodi_ertek megfelelést. Csak ÉS feltételek lehetnek (tehát field_id1 = 'szöveg' ÉS field_id2 = "masik szoveg", a 12-es tabla_id-vel jelölt sorokban.
Addig, amíg csak egy feltétel van (tehát egy field_id1 = 'szöveg'), addig ez gond nélkül megvalósítható, de amint va negy field_id2 = 'masik szoveg'), akkor már két különböző sorban kell keresnünk az adatbázisban (minden sor egy cellája a virtuális táblázat egy sorának, amelyet data_id-vel jelzünk).
Milyen megoldás ötletetek van?
Jelenleg úgy működik a rendszer, hogy lekéri az adott tabla_id-hez tartozó összes data_id értéket, ezeken végigmenve, lekéri az összes cellát, azokat egy tömbbé alakítja, és ezek után php segítségével végez feltétel ellenőrzést, ami nem éppen gazdaságos egy nagyobb adattáblánál, és rengeteg felesleges lekérdezéssel jár.
MS.
kieg
Érthetetlen
- (ahol field_id = xx ÉS valodi_ertek = yy) ÉS
- (ahol field_id = bb ÉS valodi_ertek = zz)
- ahol tabla_id = 12 ÉS
- ((ahol field_id = xx ÉS valodi_ertek = yy) VAGY
- (ahol field_id = bb ÉS valodi_ertek = zz))
Ha az a gond, hogy nem tudod előre hány darab field_id-t fogsz kapni, hát nem is tudom... Így első ránézésre nekem maga az adatbázis is túl nyakatekertnek tűnik. Lehet, az induláskor már rossz oldalról közelítetted a dolgot (=nem ilyen adatstruktúra kell neked). Onnét közelítsd a problémát, hogy a szükséges előfeltételeket ellenőrizd előbb, aztán állítsd elő ezek alapján az sql kérést.
Re: érthetetlen
A táblaszerkezet: ha van egy bejegyzésed, ami 4 oszlopból áll a valóságban, akkor ebben négy sor lehet. Azért csak ÉS feltétel van, mert kérésben csak olyan csomag jöhet, hogy pl
egyik feltétel: (field_id=12 ÉS valodi_ertek = 'a')
másik feltétel: (field_id=13 ÉS valodi_ertek = 'b'), de csak mindkettő teljesülése esetén kellenek az adott data_id-hez tartozó cellák.
Maga az adatszerkezet olyan téren kötött, hogy a módosítás a már meglévő részekben sok helyen jelentene gondot, így az a cél, hogy ne kelljen módosítani.
Azt én sem értem, hogy került oda az a hatalmas tér. A szerkesztőben egy sor nem sok nincs a táblázat előtt. :-(
Illetve az sem gond, hogy előre lekérjük az adott tabla_id-hez tartozo data_id-ket és azt felhasználjuk a lekérdezés elkészítéséhez.
Érthetetlen++
Vagy jó vagy nem
Megjegyzem: nem biztos, hogy rossz az adatbázis, de én egyáltalán nem látom át. Mi az pl., hogy "valodi_ertek"? Van hamis is? Hol?
Ill. ez a sok fied_id, stb., fogalmam sincs (és sztem másoknak se) mire való. Vagy látni kéne a többi kapcsolódó táblát v. nem tudom. Nincs eléggé konkretizálva a feladat, bip.