ugrás a tartalomhoz

Lekérdezés több sorral való megfeleltetéssel

MSzilveszter · 2012. Jan. 6. (P), 21.15
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:































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]
          ]
]
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.
 
1

kieg

MSzilveszter · 2012. Jan. 6. (P), 21.16
elsősorban magának az sql lekérdezésnek a formája a kérdés, amely magában tartalmazná egy sorként egy adott data_id-hez tartozó minden id-jű, és a field_idN+1 feltételeknek megfelelő eredményeket, hogy ne kelljen azokra utólag PHP oldalon szűrni.
2

Érthetetlen

Pepita · 2012. Jan. 6. (P), 22.21
Először is a témában mi az a képernyőnyi szabad fehér terület?
Csak ÉS feltételek lehetnek
Miért is? Most MySql-el akarod megoldani vagy nem? Ha igen, miért ne lehetne OR?!

- ahol tabla_id = 12 ÉS
- (ahol field_id = xx ÉS valodi_ertek = yy) ÉS
- (ahol field_id = bb ÉS valodi_ertek = zz)
Helyett:
- 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.
3

Re: érthetetlen

MSzilveszter · 2012. Jan. 6. (P), 22.50
Szia,

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.
4

Érthetetlen++

Pepita · 2012. Jan. 7. (Szo), 00.55
de csak mindkettő teljesülése esetén kellenek az adott data_id-hez tartozó cellák.
No, szerintem az a hiba, hogy ez sohasem lesz igaz egy rekordra. A lekérdezés ugye arról szól, hogy a megadott feltételeket a mysql motor a tábla minden rekordján megvizsgálja (az összes megadott feltételt!), és azokat a rekordokat adja vissza, amelyekre a teljes WHERE feltétel TRUE. Ha jól értem a feladatot - bár tényleg egyre érthetetlenebb - ezt úgy tudod meglépni, hogy mégis OR-ral adod meg az 1,2,x db feltétel(pár)t, és a visszakapott rekordok számát még összehasonlítod a megadott feltételek számával. Ha egyezik, mehet tovább a feldolgozás, ha nem: exit. Lehet ezt pl. két lekérdezéssel "optimalizálni": az első SELECT COUNT..., u.azzal a WHERE-el, mint a "rendes", ez a COUNT hamar lefut, és csak akkor csinálod tovább, ha ok a darab.
5

Vagy jó vagy nem

Pepita · 2012. Jan. 7. (Szo), 03.55
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.
Ez soha ne legyen cél! Ha egy adatszerkezet rossz, akkor a hibát ki kell javítani. Elsőre túl nehéz feladatnak tűnik, mégis én már többször tapasztaltam, hogy egy rossz adatbázisnál nincs rosszabb. Millió programozási gondot okoz (most is és később is) a rossz adatfelépítés miatti rengeteg felesleges csiki-csuki. Tehát jobb későn, mint soha.

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.