Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: jakie zapytanie SQL
Forum PHP.pl > Forum > Bazy danych > MySQL
regdos
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.
toolmaniak
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;
regdos
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
toolmaniak
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);
regdos
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
mwojcik
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
regdos
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.
osiris
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
mwojcik
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
osiris
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
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.