ugrás a tartalomhoz

SELECT WHERE logikai felépítése

s_volenszki · 2006. Szep. 5. (K), 11.49
Sziasztok!

Tudna valaki segíteni nekem, hogy értelmezzem a SELECT WHERE logikai felépítését? Mit is értk ez alatt (php + MySQL és ide nem kódot írtam):

Pl.: Piac az adattábla és almát keresek. Szeretném megtudni az összes kofa nevét, ahol a különböző nevű almák között akad piros alma és 100Ft/kg vagy mindegy milyen színű és olcsóbb legyen 100Ft-nál.

SELECT kofa_neve FROM piac WHERE termek = alma AND szine = piros AND ara = 100 OR termek = alma AND szine = '' AND ara < 100

Hova kerülnek a zárójelek? A zárójelek klépeznek logikai egységeket? Hogyan viszonyulnak ezek a logiaki egységek egymáshoz?

Így?????????????????
SELECT kofa_neve FROM piac WHERE (termek = alma AND szine = piros AND ara = 100) OR (termek = alma AND szine = '' AND ara < 100)
Így?????????????????

Ha azt is szeretném megtudni, hogy a kofa éppen nyitva van-e + az előző lekérdezés:

SELECT kofa_neve FROM piac WHERE nyitva = true AND termek = alma AND szine = piros AND ara = 100 OR termek = alma AND szine = '' AND ara < 100

És itt?????????????
SELECT kofa_neve FROM piac WHERE nyitva = true AND ((termek = alma AND szine = piros AND ara = 100) OR (termek = alma AND szine = '' AND ara < 100))
És itt?????????????

Ha a találtaokat listába gyűjtöm és a kofák nevéből csak az "a" betűvel kezdődőeket szeretném kigyűjteni:

SELECT kofa_neve FROM piac WHERE kofa_neve LIKE a% AND nyitva = true AND termek = alma AND szine = piros AND ara = 100 OR termek = alma AND szine = '' AND ara < 100

Itt már készvagyok!!!!!!!!!!!!!!

És ha az "a" betűvel kezdődő kofák listájában azokat az almákat szeretném megjeleníteni, amelyek megfelelnek az előző kitériumoknak (nyitva meg szín meg ár) de az almák neve "g" betűvel kezdődjön:

SELECT kofa_neve FROM piac WHERE kofa_neve LIKE a% AND nyitva = true AND termek = alma AND termekneve LIKE g% AND szine = piros AND ara = 100 OR termek = alma AND szine = '' AND ara < 100

Nézzetek rá, köszönöm: s_volenszki
 
1

SELECT WHERE logikai felépítése

szdezso · 2006. Szep. 5. (K), 13.18
Ime:

pl. 1.:
SELECT kofa_neve FROM piac WHERE (termek = alma) AND (((szine = piros) AND (ara= 100)) OR (AND ara < 100))

pl. 2.:
SELECT kofa_neve FROM piac WHERE ((nyitva=true) AND (termek = alma)) AND (((szine = piros) AND (ara= 100)) OR (AND ara < 100))

pl. 3.:
SELECT kofa_neve FROM piac WHERE ((nyitva=true) AND (termek = alma) AND (kofa_neve LIKE "a%")) AND (((szine = piros) AND (ara= 100)) OR (AND ara < 100))

pl. 4.:
SELECT kofa_neve FROM piac WHERE ((nyitva=true) AND (termek = alma) AND (kofa_neve LIKE "a%") AND (termekneve LIKE "g%")) AND (((szine = piros) AND (ara= 100)) OR (AND ara < 100))

...
2

Logikai reláció

s_volenszki · 2006. Szep. 5. (K), 13.41
Köszi a példákat, próbálom értelmezni! Azt el tudnád nekem mondani, hogy mi a logika a zárójelek felépítésének sorrendjében?

Hogyan viszonyulnak a zárójeles egységek egymáshoz? Mi az értelmezés sorrendje?

s_volenszki
3

SELECT WHERE logikai felépítése

szdezso · 2006. Szep. 6. (Sze), 15.13
Hi!

Próbálj meg logikusan gondolkodni, nem tudom tanultál-e egyetemen/főiskolán matematikai logikát? Azt lehet nagyon jól alkalmazni, a feladatod megfogalmazása kérdés formájában, azt kell ítéletkalkulus szerint visszafordítani (ha jól emléxem)...

Tahát pl.:
"Szeretném megtudni az összes kofa nevét, ahol a különböző nevű almák között akad piros alma és 100Ft/kg vagy mindegy milyen színű és olcsóbb legyen 100Ft-nál."

Erre ezt írtam:
SELECT kofa_neve FROM piac WHERE (termek = alma) AND (((szine = piros) AND (ara= 100)) OR (AND ara < 100))
Azaz:
A termék mindeféleképpen alma: termek=alma, ez egy zárójelben, mert a megfogalmazott kérdés logikai szinten való megfogalmazása esetén uúgy működik, mint matematikából tanultad: a zárójelben lévő kifejezéseket értelmezzük, számítju ki először.
Tehát a termek=alam az egy biztos fix: zárójelek között.
Finomítod a kérdésed: "akad piros alma és 100Ft"
Tehát az előző állítást finomítjuk AND kifejezéssel (ez valójában két kifejezés, s a kettő új kifejezés együtt szintén egy zárójelben).
Finomítod a kérdésed: "vagy mindegy milyen színű és olcsóbb legyen 100Ft-nál."
A mindegy milyen színűt nem kell kifejezni, mert mindegy milyen színű, azaz ebben az esetben nem tudunk rá mit mondeni, ezért ennek a mondatrésznek a logikai megfeletetéséhez nem kell írni/kifejezni semmit. Az olcsóbb legyen 100Ft-nál viszont kifejezhető. De ez (a mondat megfogalmazása szerint) vagy kapcsolatban áll piros alma és 100Ft-tal., de a termék=alama kifejezés "párjaként".

Célszerű "szépen" mefogalmazni a kérdésünket, s azt visszafejteni logika szerint.
(TRUE) AND (((TRUE) AND (TRUE)) OR (TRUE))

Az első példát elírtam a végén, helyesen:
SELECT kofa_neve FROM piac WHERE (termek = alma) AND (((szine = piros) AND (ara= 100)) OR (ara < 100))

A konrét kérdésedre a válasz: a zárójeles egységek a matematikai kiértékelés szabályainak megfelelően viszonyulnak egymáshoz.

Remélem érthető voltam... :)
4

Matematikai kiértékelés szabályai szerint

s_volenszki · 2006. Szep. 7. (Cs), 10.31
Szuper!

Köszönöm a részletes magyarázatot! Teljesen világos! Legfőképpen a "Szépen megfogalmazott kérdés" tette heylre a zavart gondolataimat!

Köszi!

s_volenszki
5

SELECT WHERE logikai felépítése

szdezso · 2006. Szep. 7. (Cs), 13.02
Hi!

Örülök, hogy segítettem, attól féltem a végére még jobban összezavarlak.
;-)

Bye.
6

SELECT a WHERE feltételben

Totti 1986 · 2010. Szep. 8. (Sze), 11.16
Sziasztok,

nem akartam új témát nyitni, és lehet, h ide illik vmennyire, amit szeretnék kérdezni.

Van egy táblám, amiben játékok részei vannak lementve.
Van egy mező, amiben le tárolva van az 1. rész, és egy másik, amiben a hozzá tartozó részek. Az 1. rész önmagához is kapcsolva van, így egy 2. mező kiolvasással az összes részt ki tudom olvasni.

Csak az a baj, hogy üreset ad vissza, az a parancs, amivel próbálkozom.
Ugyanis 1db SELECT-tel szeretném kiolvasni a részeket, mégpedig olyan gondolatmenet szerint, hogy:
"olvasd ki azokat a részeket, amik ahhoz az 1. részhez tartoznak, amihez ez a játék is tartozik"

Ez nálam így néz ki:
SELECT PART_ALL FROM tabla WHERE PART_REF="(SELECT PART_REF FROM tabla WHERE PART_ALL='101' LIMIT 1)"

De ez üreset ad vissza, még ha a 101-es érték szerepel is a mezőben.
Lehet, hogy én akarok olyat, amit nem lehet.
De ha mégis, tudnátok segíteni?

Köszi
7

SELECT PART_ALL FROM tabla

kuka · 2010. Szep. 8. (Sze), 11.56

SELECT PART_ALL FROM tabla WHERE PART_REF in (SELECT PART_REF FROM tabla WHERE PART_ALL='101' LIMIT 1)
8

IN

Totti 1986 · 2010. Szep. 8. (Sze), 12.24
tényleg, IN, nagyon köszi
azért azt ideírom, hogy a LIMIT-et nem engedélyezi IN-ben :)