Pereiti prie turinio

PAgalbos su SQL užklausa


Rekomenduojami pranešimai

Sveiki,

 

Niekaip neišeina atsifiltruoti norimų duomenų. Yra dvi lenteles:

 

LENTELE1:
item_id, title
1, preke1
2, preke2

 

LENTELE2:
id, item_id, category_id
1, 1, 100
2, 1, 101
3, 2, 100

 

Taigi man reikia atsifiltruoti prekes, kurios priklauso "100" kategorijai, tačiau nepriklauso "101".

 

Užklausa:

 

SELECT lentele1.item_id, lentele1.title FROM lentele1 
WHERE STATUS >= '1' AND item_id IN (SELECT item_id FROM lentele2 WHERE lentele2.category_id != '101' AND lentele2.category_id = '100')

 

Taigi, man turėtų atfiltruoti tik "3, 2, 100" įrašą, tačiau man atfiltruoja visus. Bandžiau su LEFT JOIN ir su INNER JOIN, tačiau vistiek atfiltruoja visus įrašus :-/

Redagavo BigBug
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Nemanyčiau, kad IDK pasiūlytas sprendimas yra teisingas.

 

SELECT l2.id, l1.item_id
FROM lentele1 AS l1
INNER JOIN lentele2 AS l2 ON l1.item_id = l2.item_id AND l2.category_id = 100 # paimam visus įrašus iš lentele2, kurie turi šią kategoriją
WHERE l1.item_id NOT IN (SELECT l3.item_id FROM lentele2 AS l3 WHERE l3.item_id = l1.item_id AND l3.category_id = 101); #Su NOT IN atmetam id, kurie yra ir 101 kategorijoje

 

Čia įrodymas, kad atsakymas yra toks, kokio tikimąsi:

http://rextester.com/EFZ30193

Redagavo NEvaldas
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Dėkui abiem. Kol laukiau atsakymo, sulipdžiau tokį variantą:

 

Lyg ir veikia šis variantas:

 

SELECT items.item_id, title
FROM lentele1
WHERE STATUS >= '1'
AND item_id
IN (

SELECT item_id
FROM lentele2
WHERE lentele2.category_id != '100'
)
AND item_id NOT
IN (

SELECT item_id
FROM lentele2
WHERE lentele2.category_id = '140'
)
AND item_id NOT
IN (

SELECT item_id
FROM lentele2
WHERE lentele2.category_id = '160'
)
AND item_id NOT
IN (

SELECT item_id
FROM lentele2
WHERE lentele2.category_id = '150'
)
LIMIT 0 , 30

Redagavo BigBug
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Dėkui abiem. Kol laukiau atsakymo, sulipdžiau tokį variantą:

 

Lyg ir veikia šis variantas:

 

SELECT items.item_id, title
FROM lentele1
WHERE STATUS >= '1'
AND item_id
IN (

SELECT item_id
FROM lentele2
WHERE lentele2.category_id != '100'
)
AND item_id NOT
IN (

SELECT item_id
FROM lentele2
WHERE lentele2.category_id = '140'
)
AND item_id NOT
IN (

SELECT item_id
FROM lentele2
WHERE lentele2.category_id = '160'
)
AND item_id NOT
IN (

SELECT item_id
FROM lentele2
WHERE lentele2.category_id = '150'
)
LIMIT 0 , 30

 

Gal tu nejuokauk su tokiais queriais :lol:

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Dėkui abiem. Kol laukiau atsakymo, sulipdžiau tokį variantą:

 

Lyg ir veikia šis variantas:

 

SELECT items.item_id, title
FROM lentele1
WHERE STATUS >= '1'
AND item_id
IN (

SELECT item_id
FROM lentele2
WHERE lentele2.category_id != '100'
)
AND item_id NOT
IN (

SELECT item_id
FROM lentele2
WHERE lentele2.category_id = '140'
)
AND item_id NOT
IN (

SELECT item_id
FROM lentele2
WHERE lentele2.category_id = '160'
)
AND item_id NOT
IN (

SELECT item_id
FROM lentele2
WHERE lentele2.category_id = '150'
)
LIMIT 0 , 30

 

Skirtumą tarp subselectu ir JOIN'u supranta tikrai ne pradedantieji, šiuo atveju geriau naudoti JOIN'us.

Redagavo Prodev
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Parašyk geresnę, kai prekė turi daug kategorijų ir reikia kelias kategorijas rodyti ir kelias nerodyti.

SELECT l2.id, l1.item_id
FROM lentele1 AS l1
INNER JOIN lentele2 AS l2 ON l1.item_id = l2.item_id AND l2.category_id IN (100, 102) # paimam visus įrašus iš lentele2, kurie turi kategoriją 100 arba 102
WHERE l1.item_id NOT IN (SELECT l3.item_id FROM lentele2 AS l3 WHERE l3.item_id = l1.item_id AND l3.category_id IN (101, 103)); #Su NOT IN atmetam id, kurie yra 101 arba 103 kategorijoje

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Sveiki dar kartą, visgi prisireikė sudėtingesnės užklausos, kurios niekaip neįkertu.

 

Kodas čia: http://rextester.com/ADSCDJ60764

 

Reikia atrinkti prekes kurios turi 140 IR 110 kategorijos_id, taciau neturi 800.

 

 

Teoriškai man turėtų išrinkti "preke5".

Redagavo BigBug
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Sveiki dar kartą, visgi prisireikė sudėtingesnės užklausos, kurios niekaip neįkertu.

 

Kodas čia: http://rextester.com/ADSCDJ60764

 

Reikia atrinkti prekes kurios turi 140 IR 110 kategorijos_id, taciau neturi 800.

 

 

Teoriškai man turėtų išrinkti "preke5".

Tai kad pagal duomenis tinka 1, 2, 3, 4, 5 nes visos jos neturi cat_id=800.

http://rextester.com/QJF46235

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Man reikia, kad ta pati prekė turėtų 110 ir 140 kategoriją. Tame pavizdyje yra tik "preke5".

Nu tai galima inner joinint i ta pacia lenta du kartus, karta ant cat_id=110, karta ant cat_id=140. Nu arba galima toki http://rextester.com/NRB56348

Redagavo hafnis1324
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

  • Prisijunk prie bendruomenės dabar!

    Uždarbis.lt nariai domisi verslo, IT ir asmeninio tobulėjimo temomis, kartu sprendžia problemas, dalinasi žiniomis ir idėjomis, sutinka būsimus verslo partnerius ir dalyvauja gyvuose susitikimuose.

    Užsiregistruok dabar ir galėsi:

    ✔️ Dalyvauti diskusijose;

    ✔️ Kurti naujas temas;

    ✔️ Rašyti atsakymus;

    ✔️ Vertinti kitų žmonių pranešimus;

    ✔️ Susisiekti su bet kuriuo nariu asmeniškai;

    ✔️ Naudotis tamsia dizaino versija;

    ir dar daugiau.

    Registracija trunka ~30 sek. ir yra visiškai nemokama.

  • Naujausios temos

  • Karštos temos

×
×
  • Pasirinkite naujai kuriamo turinio tipą...