Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL] Tagi/Etykiety/Kategorię itp. na flagach bitowych, Są jakieś alternatywy?
paziek
post
Post #1





Grupa: Zarejestrowani
Postów: 207
Pomógł: 25
Dołączył: 16.11.2006

Ostrzeżenie: (0%)
-----


Witam,

Chciałbym zrobić system dodawania tagów, etykiet, kategori itp. itd.
Pierwsza sprawa, to aby po wyświetleniu otagowanego wpisu, dało się wylistować wszystkie jego tagi.
Druga sprawa, to aby dało się wyszukiwać wpisy po dowolnej ilości tagów (czyli np. "wyświetl wpisy posiadające tag "baba" oraz "huhu")

Początkowo chciałem do tego użyć flag bitowych http://forum.php.pl/index.php?showtopic=53...rt=#entry291048
Ale mają one swoje wady:
Ogranicza mnie to do 64 tagów (w teorii, w praktyce jest to znacznie mniej, jeśli będę chciał dodać do wpisu więcej niż 1 tag)
Listowanie polegałoby albo na:
->Sprawdzaniu każdego tagu, czy pasuje do flagi bitowej na wpisie (pętla)
lub
->Stworzeniu dodatkowego pola w wpisie z relacją wpis.id <-> tagi.wpisId


Oczywiście 64 to bardzo mało jak na tagi, czy istnieje jakiś inny sposób?
Może jakoś da sie to zrobić na np. tabelce w stylu

idWpisu | idTagu

I jakieś super magiczne zapytanie do tego?
Chodzi mi tutaj o rozwiązanie z w miarę rozsądną wydajnością.



ps. Coś innego niż csv w blobie


Pozdrawiam,
Łukasz.

Ten post edytował paziek 10.12.2008, 14:25:54
Go to the top of the page
+Quote Post
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 561
Pomógł: 6315
Dołączył: 27.12.2004




Zrobić tablice słownikową ze słowami kluczowymi i dodatkową tablice która będzie łączyć produkt ze słowami kluczowymi.
czyli defacto to co napisales:
idWpisu | idTagu

Cytat
I jakieś super magiczne zapytanie do tego
Wystarczy zwykle, nie wiem po co tu magia.
Go to the top of the page
+Quote Post
paziek
post
Post #3





Grupa: Zarejestrowani
Postów: 207
Pomógł: 25
Dołączył: 16.11.2006

Ostrzeżenie: (0%)
-----


Cytat(nospor @ 10.12.2008, 14:37:21 ) *
Zrobić tablice słownikową ze słowami kluczowymi i dodatkową tablice która będzie łączyć produkt ze słowami kluczowymi.
czyli defacto to co napisales:
idWpisu | idTagu

Wystarczy zwykle, nie wiem po co tu magia.


Może tak, ale mi chyba mózg się dzisiaj wyłączył..

No wiec, mam tabelkę wpisy
id | nazwa | cośtam
----------------------------
1 | wpisJakiś | blablabla
2 | innyWpis | sialalala

oraz wpisytagi
wpisid | tagid
----------------------------
1 | 1
1 | 2
1 | 4

no i tagi
tagid | nazwa
----------------------------
1 | bah
2 | mah
3 | ciah
4 | lala
5 | buh bah


Zapytanie:
  1. SELECT w.* FROM `wpisy` AS w
  2. INNER JOIN `wpisytagi` AS wt ON w.id = wt.wpisid
  3. WHERE wt.tagid = 1 AND wt.tagid = 2 AND wt.tagid = 4


Już nawet po nazwach szukać nie będę, tylko ID tagów.. to oczywiście nie działa. Jedynie z jednym tagiem naraz.
Co mam zrobić, aby załapało więcej tagów? jakiś GROUP BY?
Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 561
Pomógł: 6315
Dołączył: 27.12.2004




  1. SELECT * FROM wpisy w
  2. LEFT JOIN wpisytagi wt ON (w.id = wt.wpisid)
  3. LEFT JOIN tagi t ON (t.id=wt.tagid)
  4. WHERE t.id IN (1,2,4)
Go to the top of the page
+Quote Post
paziek
post
Post #5





Grupa: Zarejestrowani
Postów: 207
Pomógł: 25
Dołączył: 16.11.2006

Ostrzeżenie: (0%)
-----


Cytat(nospor @ 10.12.2008, 15:18:51 ) *
  1. SELECT * FROM wpisy w
  2. LEFT JOIN wpisytagi wt ON (w.id = wt.wpisid)
  3. LEFT JOIN tagi t ON (t.id=wt.tagid)
  4. WHERE t.id IN (1,2,4)


Jeśli dobrze rozumiem, to można przetłumaczyć na:
  1. SELECT * FROM wpisy w
  2. LEFT JOIN wpisytagi wt ON (w.id = wt.wpisid)
  3. LEFT JOIN tagi t ON (t.id=wt.tagid)
  4. WHERE t.id = 1 OR t.id = 2 OR t.id = 4

A ja potrzebuję
  1. SELECT * FROM wpisy w
  2. LEFT JOIN wpisytagi wt ON (w.id = wt.wpisid)
  3. LEFT JOIN tagi t ON (t.id=wt.tagid)
  4. WHERE t.id = 1 AND t.id = 2 AND t.id = 4
Go to the top of the page
+Quote Post
nospor
post
Post #6





Grupa: Moderatorzy
Postów: 36 561
Pomógł: 6315
Dołączył: 27.12.2004




pare dni temu:
http://forum.php.pl/index.php?showtopic=108511
tez chial AND a nie OR
Go to the top of the page
+Quote Post
paziek
post
Post #7





Grupa: Zarejestrowani
Postów: 207
Pomógł: 25
Dołączył: 16.11.2006

Ostrzeżenie: (0%)
-----


Super, to rozwiązuje częsciowo problem (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Tzn. mogę już szukać wpisów, które zawierają tag1 oraz tag2
Ale teraz chciałbym móc szukać wpisów które:
zawierają tag1, tag2 oraz NIE zawierają tagu3
Próbowałem czarować z tym co napisał w tamtym temacie ucho, ale mając 4 różne tagi, dając do takiego zapytania tagid = 1 AND tagid = 2 AND tagid != 3 zwraca mi 3 wyniki (powinno 0).

Byłaby to z pewnościa użyteczna funkcja, ale i bez tego jestem zadowolony (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Ten post edytował paziek 10.12.2008, 15:58:32
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 25.12.2025 - 14:25