Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] Tagi/Etykiety/Kategorię itp. na flagach bitowych
Forum PHP.pl > Forum > Bazy danych
paziek
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.
nospor
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.
paziek
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?
nospor
  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)
paziek
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
nospor
pare dni temu:
http://forum.php.pl/index.php?showtopic=108511
tez chial AND a nie OR
paziek
Super, to rozwiązuje częsciowo problem 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 smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.