Kezdőoldal » Számítástechnika » Programozás » [SQL] Lehetséges szűrési...

[SQL] Lehetséges szűrési feltételt készíteni egy másik táblából?

Figyelt kérdés

Egészen pontosan arra vagyok kíváncsi, hogy megoldható-e (bármilyen -hatékony- módon, akár plsql is szóba jöhet) és ha igen, akkor hogyan:


Tehát van két tábla. Az egyikben tetszőleges oszlopok és adatok találhatóak. A másik táblában két oszlop: `filter_column_name` és `filter_value`.

Ebbe a táblába vennék fel tetszőlegesen oszlopnév-érték párosokat, amikre majd szűrni szeretnék.


A kérdés az, hogy hogyan lehet olyan dinamikus lekérdezést írni, ami azokra az oszlopnevekre és értékekre szűrne az első táblából, ami a második táblában található.


Feltételezem ciklussal például megoldható lehet.. ugyanakkor fontos lenne, hogy ez gyors is legyen.


(Elsősorban PostgreSQL-es megoldásban gondolkodok, de ha valakinek van ötlete MySQL-re is, akkor az is érdekel. Program verziókat nem írok, mert ez csak szimpla elmélkedés. Nincs tétje, mert nyilván alkalmazás oldalról ez kezelve van, csak kíváncsi vagyok, hogy megoldható-e hatékonyabban csak adatbázisból.)


Kiegészítés: a szűrés alatt, egy szimpla WHERE feltételt értek. (nincs semmilyen aggregáció) A legegyszerűbb példára gondolok.


Köszi a válaszokat.



2022. okt. 20. 09:16
1 2
 1/11 anonim ***** válasza:
Majd én ráguglizok neked: [link]
2022. okt. 20. 09:53
Hasznos számodra ez a válasz?
 2/11 anonim ***** válasza:
Szerintem ez egy JOIN két mező alapján. Akár view-t is definiálhatsz.
2022. okt. 20. 14:58
Hasznos számodra ez a válasz?
 3/11 A kérdező kommentje:

#1 Igen, a dinaikus sql-t már néztem, de valahogy nem áll össze... pl ha egy ciklussal legyűjtöm a mezőneveket és értékeket, akkor hogy tudom összefűzni egy where feltételbe?


#2 Hmm. Szerintem pedig nem ugyanarra gondolunk.

Az első táblába pl az alábbi mezők vannak: "name", "age", "location", "phone_number", "email"

A másik táblába pedig csak két oszlop van: `filter_column_name` és `filter_value`.

Ebben pedig értékként fel van véve mondjuk:

"age"-"27"

"location"-"London"


Akkor a lekérdezés legyűjti az első táblából az összes olyan rekordot, ahol a kor 27 és londoni. Ellenben ha bővítem a feltételeket a második táblában, akkor szűkül a lista.

Ezt egy sima JOIN-al nem tudod megoldani, mivel a mezőnevek értékként fognak szerepelni, hiszen nem tudhatjuk előre, hány feltételre szeretnénk szűrni.

2022. okt. 20. 20:24
 4/11 anonim ***** válasza:
0%

#2 balf#sz, ne foglalkozz vele.

Nem nagyon értem, hogy miért gond abból, hogy 'age' és '27' összerakni, hogy "WHERE [age] = '27'"

Amire figyelni kell, hogy kezelni kell, ha nincs feltétel, ha 1 feltétel van és ha több van.

2022. okt. 20. 21:15
Hasznos számodra ez a válasz?
 5/11 A kérdező kommentje:

#4


Nem az a gond, hanem összefűzni egybe többet is. Mivel a példák amiket találtam, végig iterálnak a rekordhalmazon..

Tehát a

where age = 27

where location = 'London'

szeretném összefűzni. De még próbálkozok vele, mert lehet csak nem látom a fától az erdőt :D


"Amire figyelni kell, hogy kezelni kell, ha nincs feltétel, ha 1 feltétel van és ha több van."

Azt én nagyon egyszerűen szoktam megoldani. Az átláthatóság miatt, mindig új sorba írok minden feltételt egy sima lekérés esetén is, ezért így szoktam (a behúzásokat képzeld oda):


select

*

from

tbl_tabla_neve

where 1=1

and mezo='ertek1'

and masik_mezo='ertek2'


Így ha kikommenteled a feltételeket, akkor is lefut tökéletesen.


Szóval elég közel vagyok a megoldáshoz... de szerintem erre aludnom kell egyet és tiszta fejjel újra elővenni.

2022. okt. 20. 22:55
 6/11 anonim ***** válasza:

El nem tudom képzelni mi a gond.

Hogy nem WHERE kell közéjük, hanem AND?

2022. okt. 20. 23:41
Hasznos számodra ez a válasz?
 7/11 A kérdező kommentje:

#6 Nem az volt a gond... :) Azt csak példának írtam. A ciklust írtam meg hibásan! Azzal bénáztam sokat, mert a változó értékét felülírtam, ahelyett hogy hozzáfűzte volna.


[link]


Végül sikerült.

2022. okt. 21. 02:35
 8/11 anonim ***** válasza:

Most már érthető, elsőre nem volt világos. Erre valószínűleg egy pl/pgsql függvényt írnék, de ha van valami programnyelv, amin már kapcsolódok az adatbázishoz, akkor lehet, hogy abban oldanám meg.

#4, otthon a szüleiddel beszélj így, hátha nem vágnak szájon.

2022. okt. 21. 07:10
Hasznos számodra ez a válasz?
 9/11 A kérdező kommentje:

#8 Igen, a kérdés pontosan a "hogyan" részére irányult. :)


"Erre valószínűleg egy pl/pgsql függvényt írnék"

Igen, ezzel kezdtem: (bármilyen -hatékony- módon, akár plsql is szóba jöhet) Szerintem elsőre tényleg picit felületesen futottad át a kérdést.


"programnyelv, amin már kapcsolódok az adatbázishoz, akkor lehet, hogy abban oldanám meg."

Abban megvan oldva már elég régen, az nyilván nem nagy kunszt. Csak bizonyos esetekben nem hatékony. Például vegyük azt a szkenáriót, hogy van egy kb 1 millió soros bemeneti rekordhalmazod, ami egy terméklista amit a nagyker küld (nem szűrnek semmit, "mert minek?" ezért tele van olyan termékekkel is, amivel az adott kiskereskedő, akinek dolgozol, nem foglalkozik).


A példa kedvéért egy MVC keretrendszerre épülő alkalmazást készítesz és ha a keretrendszer (bizonyos) ORM elemeit szeretnéd kihasználni, akkor a "Product", mint entitás, inputként egy komplett táblát (vagy viewt) akar használni.

Ez persze még mindig "faék", hiszen csinálsz egy view-t, amibe belerakod a szűrési feltételeid és megvagy. Na igen. Aztán jövő hónapban telefonál az ügyfeled, hogy figyi, módosítani kellene a dolgokon, mert a nagyker új márkákat is felvett a listába és azok sem kellenének (vagy épp azok kellenének), most mindegy.

Hamar rájössz, hogy a kódba égetni (bármit is) nagyon nem célszerű (akár egy lekérdezés szintjén sem).

Ekkor 3 utat választhatsz:

a) megpróbálod programkód szintjén "szűrni", de ha nem teszed meg előre, akkor teljesen feleslegesen végzel műveleteket 1 millió rekordon, mert lehet, csak 400-ra van belőle szükség.

b) elengeded a keretrendszer ORM részét és már a bemeneti adathalmazt is lekérdezésként írod meg, viszont ezzel át kell írnod az egész alkalmazást. (soha nem térül meg)

c) betöltéskor leszűröd egy temp táblába, és abból dolgozol. (nyilván ezt választottam)


Ezért arra voltam kíváncsi, hogy megoldható-e ez (fontos: HATÉKONYAN) más módon is és ha igen, akkor hogyan. Ezzel a megoldással, amit az előző válaszomban linkeltem, gyakorlatilag leszűrhető a teljes adathalmaz a kód bármilyen módosítása nélkül is, szimplán adatbázis oldalról, ráadásul a függvény egy táblát ad vissza, amit ha egy view-ban kérsz le, akkor a framework ugyanúgy használhat, mint egy táblát, tehát továbbra is működik az ORM.


Így talán érthető mi volt a célom vele.


Nyilván nem fogom most átírni az alkalmazást (felesleges) mert a temp táblás megoldás is nagyon gyors és hatékony, sőt, ott is megoldható, hogy akár az ügyfél saját magának szerkessze felületről a szűrési feltételeket, tehát a célnak tökéletesen megfelel. Ugyanakkor nagyon érdekelt ez az alternatív megoldás. :)

2022. okt. 21. 07:42
 10/11 anonim ***** válasza:

#9

Lehet, hogy gyorsabban értetted meg, mint én, de emberileg egy nagy nulla vagy, ne legyél büszke magadra, nincs miért. IRL is így szoktál beszélgetni, vagy csak a vackodból vagy ilyen bátor névtelenül?

2022. okt. 21. 08:07
Hasznos számodra ez a válasz?
1 2

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!