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.

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