GRY-Online.pl --> Archiwum Forum

Tabela i zapytanie wyszukiwanie - proszę o pomoc (SQL).

16.10.2007
18:25
[1]

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?

16.10.2007
19:18
[2]

Lozano23 [ Pretorianin ]

^

16.10.2007
19:51
[3]

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. :)

16.10.2007
20:17
[4]

diabelek1 [ szczęśliwy ]

Albo osobna tabela, ktora bedze trzymala powiazania film - kategoria.

16.10.2007
20:21
[5]

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...

16.10.2007
20:36
[6]

slowik [ NightInGale ]

po prostu baza w 3 postaci normalnej tworzysz
dodatkowa tabele dla tego powiazania i po bolu :-)

16.10.2007
20:48
[7]

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.

16.10.2007
21:03
smile
[8]

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. :)

16.10.2007
21:07
[9]

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?

16.10.2007
21:07
smile
[10]

slowik [ NightInGale ]

tak o to w tym chodzi :-)

16.10.2007
21:21
[11]

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 :).

16.10.2007
22:13
[12]

Lozano23 [ Pretorianin ]

^

16.10.2007
22:35
[13]

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))

© 2000-2024 GRY-OnLine S.A.