Topic: Paveiksliukų tag'ai.

Sveiki,
gal kas galit pagelbėt ar ant teisingo kelio užvesti.

Yra trys lentelės:

pics
| id | name | ext |

tags
| id | text |

tagged
| id | pic_id | tag_id |

Kaip tikriausiai supratote yra paveiksliukai ir jų tag'ai. Noriu padaryti paiešką pagal tag'us. Tiksliau dvi paieškas. Viena "and" kita "or" principu.
"or" paieškos užklausa yra tokia

SELECT tagged.*, tags.text, pics.name, pics.ext FROM `tagged`
LEFT JOIN `tags` ON tagged.tag_id = tags.id 
LEFT JOIN `pics` ON tagged.pic_id = pics.id 
WHERE tags.text = 'sky' OR tags.text = 'blue' OR ... ir t.t.

Tačiau jei yra paveiksliukas turintis tiek 'sky' tiek 'blue' tag'us tai jį parenka du kartus. Tai išsprendžiau su php pagalba, tačiau manau optimaliau būtų pakeisti užklausą. Bandžiau ir su DISTINCT ir su GROUP BY, tačiau neišėjo man nieko :|

Kita problema yra "and" paieška. Visiškai neįsivaizduoju nuo kurio galo pradėti ją rašyti :| Reikia, kad atrinktų tik tuos paveiksliukus kurie turi (pateikto pavyzdžio atveju) tiek "sky" tiek "blue" tag'ą. Bet tuo pačiu ir informaciją apie juos (reikalingi visi stulpeliai esantys auksčiau pateiktoje užklausoje). Gal turite kokių nors minčių?

Re: Paveiksliukų tag'ai.

Taip, reikia viską grupuoti (GROUP BY) pagal paveiksliuko_id, o tag'us susiklijuoti ten su GROUP_CONCAT() funkcija ar kita agregatine funkcija pagal poreikius.

Re: Paveiksliukų tag'ai.

Ačiū, padėjo dėl "or" paieškos :)
O kaip su "and" paieška?

Re: Paveiksliukų tag'ai.

aegis wrote:

Ačiū, padėjo dėl "or" paieškos :)
O kaip su "and" paieška?

Lygiai tas pats, tik tezultatų bus mažiau, bet esmė nesikeičia.

Re: Paveiksliukų tag'ai.

minde wrote:
aegis wrote:

Ačiū, padėjo dėl "or" paieškos :)
O kaip su "and" paieška?

Lygiai tas pats, tik tezultatų bus mažiau, bet esmė nesikeičia.

Lygiai tas pats? Turi omeny "OR" pakeisti į "AND"? Nelabai išeina taip. Nerodo nei vieno rezultato.

Re: Paveiksliukų tag'ai.

Ai, aš ne apie tai rašiau - apie grupavimą.

Norint, kad įvyktų loginė funkcija AND (ir) tai reikia pagalvoti logiškai. Juk negali tas pats stulpelis būtų lygus iš karto dviem reikšmėm. Todėl turi palikti OR operatorius, bet papildomai skaičiuoti kiek grupėse gavosi rezultatų (COUNT()). Tas suskaučiuotas elementas rezultate turi būti lygus visų ieškomų tag'ų skaičiui.

Re: Paveiksliukų tag'ai.

minde wrote:

Ai, aš ne apie tai rašiau - apie grupavimą.

Norint, kad įvyktų loginė funkcija AND (ir) tai reikia pagalvoti logiškai. Juk negali tas pats stulpelis būtų lygus iš karto dviem reikšmėm. Todėl turi palikti OR operatorius, bet papildomai skaičiuoti kiek grupėse gavosi rezultatų (COUNT()). Tas suskaučiuotas elementas rezultate turi būti lygus visų ieškomų tag'ų skaičiui.

Vat ties paryškinta vieta ir pastrigau aš. O toliau ką parašei nelabai supratau... :| Gal gali kokį pavyzdį parašyti? Na nebūtinai kad iškart tiktų man, bet nors ant kelio kad užvesti.

Re: Paveiksliukų tag'ai.

SELECT tagged.*,
   COUNT(DISTINCT tags.id) AS kiek,
   GROUP_CONCAT(tags.text) AS tags_text,
   pics.name,
   pics.ext
FROM `tagged`
   LEFT JOIN `tags` ON tagged.tag_id = tags.id 
   LEFT JOIN `pics` ON tagged.pic_id = pics.id 
WHERE tags.text = 'sky'
   OR tags.text = 'blue'
   OR tags.text = 'high'
GROUP BY pics.id
HAVING kiek = 3

Kažkas panašaus.

Re: Paveiksliukų tag'ai.

minde wrote:
SELECT tagged.*,
   COUNT(DISTINCT tags.id) AS kiek,
   GROUP_CONCAT(tags.text) AS tags_text,
   pics.name,
   pics.ext
FROM `tagged`
   LEFT JOIN `tags` ON tagged.tag_id = tags.id 
   LEFT JOIN `pics` ON tagged.pic_id = pics.id 
WHERE tags.text = 'sky'
   OR tags.text = 'blue'
   OR tags.text = 'high'
GROUP BY pics.id
HAVING kiek = 3

Kažkas panašaus.

Ačiū. Po biškį pradedu gaudytis :)
Tas HAVING kiek = x kur x yra lygus WHERE tags.text skaičiui, taip? :)

Re: Paveiksliukų tag'ai.

aegis wrote:

Ačiū. Po biškį pradedu gaudytis :)

Neapsigauk, iki tikro gaudymosi dar reikia daug išmokti.

aegis wrote:

Tas HAVING kiek = x kur x yra lygus WHERE tags.text skaičiui, taip? :)

HAVING yra praktiškai tas pats, kas WHERE, tik tiek, kad jis tikrinamas PO tam tikrų veiksmų, šiuo atveju naudojamas tam, kad "kiek" jau būtų suskaičiuotas.

Re: Paveiksliukų tag'ai.

minde wrote:
aegis wrote:

Ačiū. Po biškį pradedu gaudytis :)

Neapsigauk, iki tikro gaudymosi dar reikia daug išmokti.

žinau :) Turėjau omeny, kad gaudausi konkrečioje situacijoje.

Re: Paveiksliukų tag'ai.

Jeigu apie kiek'į tai, taip, kas kiek lyginamas, su kiek yra ieškoma tag'ų.

Re: Paveiksliukų tag'ai.

minde wrote:
SELECT tagged.*,
   COUNT(DISTINCT tags.id) AS kiek,
   GROUP_CONCAT(tags.text) AS tags_text,
   pics.name,
   pics.ext
FROM `tagged`
   LEFT JOIN `tags` ON tagged.tag_id = tags.id 
   LEFT JOIN `pics` ON tagged.pic_id = pics.id 
WHERE tags.text = 'sky'
   OR tags.text = 'blue'
   OR tags.text = 'high'
GROUP BY pics.id
HAVING kiek = 3

Kažkas panašaus.

O ar įmanoma šitą užklausą papildyti visais paveiksliuko tagais? Na pvz. 'kažkokia_užklausa AS all_tags'. Akys mano krypsta į sub-queries. Reikiama linkme mąstau?

Re: Paveiksliukų tag'ai.

Nelabai dar suprantu ką reiškia "all tags".

Jeigu tau reikia tik viso sąrašo paveiksliukų ir tag'ų, tai užklausa paprastėja, nes nereikia filtruoti pagal tag'ų pavadinimą ir papildomai atfiltruoti koks tag'ų skaičius turi būtinai būti rezultatuose.

Re: Paveiksliukų tag'ai.

minde wrote:

Nelabai dar suprantu ką reiškia "all tags".

Jeigu tau reikia tik viso sąrašo paveiksliukų ir tag'ų, tai užklausa paprastėja, nes nereikia filtruoti pagal tag'ų pavadinimą ir papildomai atfiltruoti koks tag'ų skaičius turi būtinai būti rezultatuose.

Dabartinę užklausa atrenka paveiksliukus kurie turi tag'us pvz. 'sky' ir 'blue'. O tas "all tags" tai būtų dar vienas stulpelis rezultate, kuriame būtų surašyti visi to paveiksliuko tag'ai.

Re: Paveiksliukų tag'ai.

aegis wrote:
minde wrote:

Nelabai dar suprantu ką reiškia "all tags".

Jeigu tau reikia tik viso sąrašo paveiksliukų ir tag'ų, tai užklausa paprastėja, nes nereikia filtruoti pagal tag'ų pavadinimą ir papildomai atfiltruoti koks tag'ų skaičius turi būtinai būti rezultatuose.

Dabartinę užklausa atrenka paveiksliukus kurie turi tag'us pvz. 'sky' ir 'blue'. O tas "all tags" tai būtų dar vienas stulpelis rezultate, kuriame būtų surašyti visi to paveiksliuko tag'ai.

Tai sujunk abi lenteles ir sugrupuok pagal paveiksliuko ID.

Re: Paveiksliukų tag'ai.

minde wrote:
aegis wrote:
minde wrote:

Nelabai dar suprantu ką reiškia "all tags".

Jeigu tau reikia tik viso sąrašo paveiksliukų ir tag'ų, tai užklausa paprastėja, nes nereikia filtruoti pagal tag'ų pavadinimą ir papildomai atfiltruoti koks tag'ų skaičius turi būtinai būti rezultatuose.

Dabartinę užklausa atrenka paveiksliukus kurie turi tag'us pvz. 'sky' ir 'blue'. O tas "all tags" tai būtų dar vienas stulpelis rezultate, kuriame būtų surašyti visi to paveiksliuko tag'ai.

Tai sujunk abi lenteles ir sugrupuok pagal paveiksliuko ID.

Turi omeny dar vieną LEFT JOIN? čia optimaliausias variantas?