Wpis z mikrobloga

#php #programowanie #sql
Czołem, mam taką zagwozdkę:
Tworzę stronę z artykułem, który ma w sobie tabelę z tagami oznaczonymi jako numerki - 1,2,3, itd. w zależności od tego jakie się wybierze i może ich być jakaś tam ilość (w założeniu nieskończona). Wywołuję tę tabelkę i dzielę cały ciąg za pomocą str_split, dostaję każdy numerek oddzielnie.
Teraz chce wywołać z bazy danych artykuły, które mają najbardziej podobnie dobrane tagi do tych, które ma dany artykuł (powiedzmy że są to na przykład 3 powiązane artykuły). No i nie wiem jak to zrobić. W sensie, mogę wywołać coś w rodzaju:
SELECT * FROM articles WHERE tags LIKE %NUMER_TAGA% OR LIKE itd. albo JOIN itd., no ale nawet jeśli to zrobię, to wywoła mi po jednym artykule pojedynczo do każdego tagu. A chciałbym to jeszcze posortować w zależności od tego ile razy LIKE jest poprawny. Mam nadzieję, że to jasno wytłumaczyłem...
działam na sqlite, pliska o pomoc ;)
  • 12
@BenAffleck: weź zapomnij o splicie i zrób osobną tabelę relacyjną. Później JOINem ogarniesz swój problem i wyciągniesz błyskawicznie artykuły o wspólnych wybranych tagach.
@BenAffleck: Bez zmiany tabel można tak:
select *,
case when Tags like '%tag1%' then 1 else 0 end +
case when Tags like '%tag2%' then 1 else 0 end as TagsCount
from articles
where TagsCount > 0
order by TagsCount
@ksab: dzięki! Nie wiedziałem nawet o tych funkcjach, już kombinowałem z pobieraniem każdego wpisu, w którym LIKE się zgadza, a później żeby zliczyć powtórki i wg nich sortować, a tu proszę ;)
@BenAffleck:
1) Zapewne używasz MySQL więc użyj find_in_set() zamiast like
2) Zrobisz sobie ałka jak będziesz zapisywał 1,2,3 zamiast tego zrób ,1,2,3, i wyszukuj LIKE '%,1,%'
3) Zarówno MySQL jak i postgres wspierają json i ma to dodatkową zaletę że można jsona indeksować w postgresie, postgres poza tym oferuje też hstore i tablice.