![]() |
![]() ![]() |
![]() |
![]()
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 |
|
|
![]()
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; |
|
|
![]()
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 |
|
|
![]()
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); |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 9 Pomógł: 0 Dołączył: 18.12.2004 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); 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 |
|
|
![]()
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 :
|
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 9 Pomógł: 0 Dołączył: 18.12.2004 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 :
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. |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 121 Pomógł: 15 Dołączył: 19.07.2007 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
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.
W twoim przypadku bedzie to:
@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 |
|
|
![]()
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!
|
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 18.07.2025 - 00:42 |