Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> jakie zapytanie SQL, user_cecha: user_id, cecha_id - użytkownicy mający n-wybrancyh-cech j
regdos
post 28.07.2007, 10:55:21
Post #1





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 18.12.2004

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


Wydaje mi sie, że mam pojecie o SQL-u ale wymiękłem przy czymś takim:


tabela: user: id, nazwa
tabela: cecha: id, nazwa

tabela przypisująca cechy do danego użytkownika:

user_cecha: user_id, cecha_id

wszystko jest proste żeby wyciągną użytkowników o określonej cesze czy też cechy danego użytkownika, ale jak wyciągnąć listę userów, którzy mają n-wybranych-cech jednocześnie ?

z góry dzięki za pomoc.

Ten post edytował regdos 28.07.2007, 11:48:25
Go to the top of the page
+Quote Post
toolmaniak
post 28.07.2007, 11:42:09
Post #2





Grupa: Zarejestrowani
Postów: 77
Pomógł: 0
Dołączył: 29.05.2006
Skąd: /dev/null

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


Jeżeli Twoja tabela z cechami ma takie pola tj.: user_cecha: user_id, cecha_id to znaczy że przypisanie więcej niż jednej cechy do jakiegoś użytkownika spowoduje powtarzanie się ID danego usera więcej niż raz w tej tabeli, co można wykorzystać poprzez następujące zapytanie SQL:

select * from cechy group by user_id having count(*) > 1;
Go to the top of the page
+Quote Post
regdos
post 28.07.2007, 11:47:09
Post #3





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 18.12.2004

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


chyba nie do końca zrozumiale sformułowałem problem.

przykład:
user 1 ma cechy 1,2,3,4,5
user 2 ma cechy 1,3,5
user 3 ma cechy 1,2
user 4 ma cechy 1,2,4
user 5 ma cechy 1,2,4,5

jak wyciągnąć listę userów mających cechy: 1 i 2 i 4 w odpowiedzi powinniśmy dostać userów 1 i 4 i 5
Go to the top of the page
+Quote Post
toolmaniak
post 28.07.2007, 12:00:33
Post #4





Grupa: Zarejestrowani
Postów: 77
Pomógł: 0
Dołączył: 29.05.2006
Skąd: /dev/null

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


A takie coś, niestety nie moge tego sprawdzić, ale może oto chodziło

SELECT DISTINCT user_id FROM cechy WHERE cecha_id IN (1,2,4);
Go to the top of the page
+Quote Post
regdos
post 28.07.2007, 12:14:07
Post #5





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 18.12.2004

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


Cytat(toolmaniak @ 28.07.2007, 11:00:33 ) *
A takie coś, niestety nie moge tego sprawdzić, ale może oto chodziło

SELECT DISTINCT user_id FROM cechy WHERE cecha_id IN (1,2,4);


jeżli już to SELECT DISTINCT user_id FROM user_ cechy WHERE cecha_id IN (1,2,4);
ale to już testowałem i nie działa bo to działa jak zwykły OR czyli pokaże wszystko co ma cechę 1 lub 2 lub 4
Go to the top of the page
+Quote Post
mwojcik
post 31.07.2007, 10:34:01
Post #6





Grupa: Zarejestrowani
Postów: 69
Pomógł: 0
Dołączył: 22.07.2007

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


W ostatecznosci proste zapytanie, jednak im wiecej cech to bys musial sklejac stringa za pomoca PHP w jakiejs petli, bo reczne wpisywanie mija sie troche z celem :

  1. SELECT user_id FROM user_cechy WHERE cecha_id = 1 AND cecha_id = 2 AND cecha_id = 4 GRUOP BY user_id
Go to the top of the page
+Quote Post
regdos
post 2.08.2007, 22:31:00
Post #7





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 18.12.2004

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


Cytat(mwojcik @ 31.07.2007, 09:34:01 ) *
W ostatecznosci proste zapytanie, jednak im wiecej cech to bys musial sklejac stringa za pomoca PHP w jakiejs petli, bo reczne wpisywanie mija sie troche z celem :

  1. SELECT user_id FROM user_cechy WHERE cecha_id = 1 AND cecha_id = 2 AND cecha_id = 4 GRUOP BY user_id


Sklejenie nie jest problemem ale takie zapytanie nie działa, bo ANDy odnoszą sie do jednej krotki, w której cecha_id powinna mieć jednocześnie wartosci 1, 2 i 3, a tak nie ma ma.
Go to the top of the page
+Quote Post
osiris
post 3.08.2007, 11:48:35
Post #8





Grupa: Zarejestrowani
Postów: 121
Pomógł: 15
Dołączył: 19.07.2007

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


Rozwiazanie jest proste:
  1. SELECT user_id, COUNT(cecha_id) AS ile
  2. FROM user_cechy WHERE cecha_id IN (1,2,4)
  3. GROUP BY user_id
  4. HAVING ile = 3

Oczywiscie jesli bedziesz poszukiwal userow z 5 cechami to: HAVING ile = 5
Go to the top of the page
+Quote Post
mwojcik
post 10.08.2007, 13:34:14
Post #9





Grupa: Zarejestrowani
Postów: 69
Pomógł: 0
Dołączył: 22.07.2007

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


Generalnie problem ciekawy i zainteresowal mnie. Co do mojego poprzedniego postu istotnie byl bez sensu bo krotka nie moze przyjmowac 3 wartosci na raz.
Jednak doczytalem i znalazlem informacje, ze istnieje coś takiego jak samozlaczenie (SELF JOINs), ktore dziala w sposob taki, jakbysmy mieli 2 kopie tej samej tabeli, ktora pozniej laczymy warunkiem za pomoca JOIN.
Przyklad : znalezc pracownika z tabeli "obecnosci", ktory byl 3 i 5 maja.
  1. SELECT nazwisko FROM obecnosci AS tab1
  2. JOIN obecnosci AS tab2
  3. WHERE tab1.pracownik_id = tab2.pracownik_id AND tab1.DATA='2007-05-01' AND tab2.DATA='2007-05-03'

W twoim przypadku bedzie to:
  1. SELECT t1.user_id FROM user_cechy AS t1
  2. JOIN user_cechy AS t2 ON t1.user_id = t2.user_id
  3. JOIN user_cechy AS t3 ON t2.user_id = t3.user_id AND t1.cecha_id = 1 AND t2.cecha_id = 2 AND t3.cecha_id = 4



@osiris - twoj sposob nie dziala na MS SQL SERVER 2005 - baza nie rozpoznaje aliasa 'ile' przy HAVING

Ten post edytował mwojcik 10.08.2007, 13:39:05
Go to the top of the page
+Quote Post
osiris
post 19.08.2007, 19:24:32
Post #10





Grupa: Zarejestrowani
Postów: 121
Pomógł: 15
Dołączył: 19.07.2007

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


Cytat
@osiris - twoj sposob nie dziala na MS SQL SERVER 2005 - baza nie rozpoznaje aliasa 'ile' przy HAVING

Jesli alias nie dziala to wystarczy wklepac cala funkcje do HAVING i voila!
  1. SELECT user_id, COUNT(cecha_id) AS ile
  2. FROM user_cechy WHERE cecha_id IN (1,2,4)
  3. GROUP BY user_id
  4. HAVING COUNT(cecha_id) = 3
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 18.07.2025 - 00:42