![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 14 Pomógł: 0 Dołączył: 13.09.2012 Ostrzeżenie: (0%) ![]() ![]() |
Witam serdecznie.
Gdzieś się zamieszałem w logice bazy czy zapytaniu a może jakieś zaćmienie ?! Mam 3 tabele TEMATY , TAGI i łaczącą poprzednie tabele TEMATY_TAGI gdzie są pary tematID i tagID czyli do danego tematu są przypisane jakieś tagi po przez podanie w tabeli TEMATY_TAGI rekordu zawierającego id tematu id tagu - standard i teraz chciał bym wyciągnać z tego informacje -> temat który zawiera podane tagi czyli w skrócie selec where tag1 and tag2 and tag3 - co daje mi pusty wynik mimo iż podane powiązania są wprowadzone wersja z lub czyli select where tag1 or tag2 or tag3 daje już wyniki ale mi chodzi o zawężenie wyszukiwania czyli temat który ma przypożądkowany tag1 i tag2 i tag3 a nie ten albo ten. Gdzie się zamotałem ![]() ale teraz zapytanie:
|
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
tagi.nazwa = 'rower' AND tagi.nazwa = 'sport'
Trudno oczekiwac aby tag jednoczesnie mial wartosc ROWER i SPORT...... O LUB nie slyszal? No chyba ze chcesz by dany temat mial wszyskie podane tagi a nie jakikolwiek z nich. Wowczas musisz zrobic tyle JOIN na TAGI ile tagow szukasz i warunek AND dawac na kazdego JOIN a nie jak teraz ze wszystko w ramach jednego JOIN masz -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 14 Pomógł: 0 Dołączył: 13.09.2012 Ostrzeżenie: (0%) ![]() ![]() |
Chodzi mi własnie o wersje temat i jego wszystkie tagi ale jakoś nie mogę sobie wyobrazić podanej przez ciebie konstrukcji - mógł byś rozwinąć myśl - lub jakiś przykładzik
Pozdro |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 340 Pomógł: 49 Dołączył: 3.07.2009 Skąd: Rzeszów Ostrzeżenie: (0%) ![]() ![]() |
jedną tabelę można dołączyć wielokrotnie, ale wymaga to używania aliasów można też użyć funkcji exists http://dev.mysql.com/doc/refman/5.0/en/exi...subqueries.html można kombinować z grupowaniem oraz HAVING rozwiązań może być wiele Ten post edytował bpskiba 28.03.2014, 21:34:28 |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 14 Pomógł: 0 Dołączył: 13.09.2012 Ostrzeżenie: (0%) ![]() ![]() |
Dzięki - aktualnie walczę z tematem
|
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 282 Pomógł: 89 Dołączył: 12.04.2011 Ostrzeżenie: (0%) ![]() ![]() |
W najprostszym podejściu, jeśli chcemy znaleźć tylko ID tematów posiadających wszystkie podane tagi (przykładowo tagi o ID 1 i 2) robimy to tak:
Rozbudowując to o nazwy pobrane z innych tabel mamy:
|
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 1 421 Pomógł: 310 Dołączył: 18.04.2012 Ostrzeżenie: (0%) ![]() ![]() |
Wszystko OK, ale zapomniałeś o DISTINCT. Powinno być w pierwszym HAVING Count(DISTINCT tagID)=2, a w drugim Count(DISTINCT tagID) AS pasujacych_tagow
|
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 282 Pomógł: 89 Dołączył: 12.04.2011 Ostrzeżenie: (0%) ![]() ![]() |
Założyłem jedynie, że dla danego tematu ten sam tag nie będzie dodany wielokrotnie. Gdyby się powtarzały distinct faktycznie byłoby niezbędne. Ale czy będziemy mieli temat z tagami 'sport', 'sport', 'rower', 'rower', 'rower'? W większości podobnych przypadków, czyli ogólnie sztucznych tabel łączących dwie inne tabele w celu uzyskania relacji wiele do wielu, pary id z obu tabel są unikalne, a zrobienie z takiej pary klucza głównego zamiast osobnego autoinkrementowanego id jest całkiem dobrym pomysłem. Wtedy nawet próba powtórzenia jakiegoś tagu dla tego samego tematu zakończy się błędem.
|
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 1 421 Pomógł: 310 Dołączył: 18.04.2012 Ostrzeżenie: (0%) ![]() ![]() |
Fakt. Ja już wybiegłem trochę do przodu - do tagów z wagami
![]() |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 14.08.2025 - 08:05 |