Lozano23 [ Pretorianin ]
Tabela i zapytanie wyszukiwanie - proszę o pomoc (SQL).
Otóż mam tabelę kategorii
- 1 - Film
- 2 - Teatr
- 3 - Muzyka
- 4 - Nauka
- 5 - Religia
itd, itp.
Teraz użytkownik może zaznaczyć więcej niż jedną kategorię dodając artykuł do bazy danych.
Pytanie - w jaki sposób zapisać te kategorie do bazy danych?
Jeśli zapiszę je w formie stringu, czyli np. "3,5,7" to jak skonstruować zapytanie, które wyciągnie ten artykuł, jeśli użytkownik zaznaczy kategorie 3 i 7?
Lozano23 [ Pretorianin ]
^
Madril [ I Want To Believe ]
A nie prościej będzie zrobić jakąś maskę binarną i z tym to porównywać?
Dla 4 bajtowego INT będą to 33 (jeśli nie byłoby opcji artykułu bez kategorii) kategorie, pewnie tyle wystarczy. :)
diabelek1 [ szczęśliwy ]
Albo osobna tabela, ktora bedze trzymala powiazania film - kategoria.
Regis [ ]
Albo osobna tabela, ktora bedze trzymala powiazania film - kategoria.
Nic dodac, nic ujac. Potem wystarczy zrobic zapytanie 'JOIN', ktore za pomoca 'WHERE' wybierze pozadane rekordy. W razie gdyby z jakiegos powodu (zalezy jak sie zbuduje zapytanie i jak sie przechowuje reszte danych w bazie) pojawily sie 'duble', to przyda sie slowko 'DISTINCT'.
Zapisywanie tego w formie stringa jest jak jechanie z Warszawy do Berlina przez Moskwe. Oczywiscie mozna to zrobic, na przyklad uzywajac 'LIKE' oraz znaku %, ale po co...
slowik [ NightInGale ]
po prostu baza w 3 postaci normalnej tworzysz
dodatkowa tabele dla tego powiazania i po bolu :-)
Lozano23 [ Pretorianin ]
Hmmm, trochę się zamotałem. Tabela dla powiązania ...
Dobra, więc mamy tabelę:
a) kategorie
- kat_id - kat_nazwa
b) artykułów
- art_id - kat_id - art_nazwa
i tabela kat_art?
I niej bym trzymał id artykułu i id kategorii?
- art_id - kat_id
- 1 - 3
- 1 - 5
- 1 - 6
- 2 - 2
- 2 - 4
Spoko, jeśli jest to w miarę poprawne, to OK.
Ale warunek listy kategorii wybranych przez użytkownika muszę wrzucić w formie łańcucha.
Madril [ I Want To Believe ]
Moim zdaniem, dla niewielkiej liczby kategorii, lepszym rozwiązaniem jest maska binarna. :P
Chociaż to wszystko zależy gdzie to ma być stosowane. :)
diabelek1 [ szczęśliwy ]
Lozano23 -> To co napisales jest poprawne, ale nie rozumiem tego zdania:
Ale warunek listy kategorii wybranych przez użytkownika muszę wrzucić w formie łańcucha.
EDTI:
I po co Ci w tabeli artykulow kat_id?
slowik [ NightInGale ]
tak o to w tym chodzi :-)
Lozano23 [ Pretorianin ]
diabelek1 ---> sorry, z rozpędu dałem kat_id w artykulach
Ok, mam zapytanie:
SELECT dbo.artykuly.art_id, dbo.artykuly.art_title, dbo.artykuly.art_content, dbo.art_kat.art_cat_id
FROM dbo.artykuly INNER JOIN
dbo.art_kat ON dbo.artykuly.art_id = dbo.art_kat.art_id
WHERE (dbo.art_kat.art_cat_id IN (1,5,7))
I owszem zwraca mi prawidłowo artykuły.
Tylko teraz mam takie problem (trochę wydziwiam chyba). Chciałbym dać możliwość wyświetlenia artykułów, które są dokładnie w kategorii 4 i 5. Czyli jeśli artykuł jest w 1,4,5 albo tylko 5 to nie zostanie wyświetlony :).
Lozano23 [ Pretorianin ]
^
Thrallik [ Konsul ]
SELECT dbo.artykuly.art_id, dbo.artykuly.art_title, dbo.artykuly.art_content, dbo.art_kat.art_cat_id
FROM dbo.artykuly INNER JOIN
dbo.art_kat ON dbo.artykuly.art_id = dbo.art_kat.art_id
WHERE (dbo.art_kat.art_cat_id IN (4,5) and dbo.art_kat.art_cat_id not in (select dbo.art_kat.art_cat_id from dbo.art_kat where dbo.art_kat.art_cat_id not in (4,5))