Zapytanie Join

0

Witajcie, jestem nowy z SQL i joiny to dla mnie trochę czarna magia, którą próbuję okiełznać. Mam 3 tabele (many to many):

user: | id | name |
items: | id | name | more | author | ....
followers: | id_user | author |

W całym założeniu chciałbym, aby zapytanie znalazło id usera na podstawie name (dynamicznie wprowadzane w url, np. name: admin w tabeli user ma id 1), a następnie wyświetliło wszystkie items, które spełniają założenie w followers - zwróć wszystkie itemy dla id_user, których autorem jest author z followers.
Czy może mi ktoś objaśnić jak powinno wyglądać zapytanie? Jak rozumiem muszę użyć many to many, INNER JOIN?

0

Chyba chodzi Ci o to ... chociaż nie rozumiem dokładnie Twojego posta :(

SELECT u.ID, i.id, i.name, i.more, i.author

FROM [user] u INNER JOIN items i
ON u.name = i.name
INNER JOIN followers f ON i.author = f.author
0

Dzięki za odpowiedź. Chciałbym, aby po wejściu na adres wyświetliło wszystkie items przypisane przez followers (wszystkie items, których autor pokrywa się z tym w followers).
Załóżmy url: example.com/api/items/admin
user admin ma id 1, więc w bazie followers szukam wszystkie rekordy z id_user = 1 \ np.
id_user =1 | exampleAuthor
id_user =1 | exampleAuthor2
Chciałbym zwrócić w zapytaniu wszystkie items, których autorem jest exampleAuthor oraz exampleAuthor2
Teraz rozumiesz?

ps. teraz się zastanawiam czy nie łatwiej będzie zamiast np. id_user podać po prostu nazwę użytkownika, która i tak będzie unikalna więc nie będę musiał łączyć się z tablicą user, a bezpośrednio z followers, ale jak to się ma do np. indexów? Mogę prosić o podpowiedź w tym temacie? Nie wiem czy nie mieszam pojęć...

0

Tak teraz bardziej czytelnie opisałeś problem. Poprawiony kod poniżej:

 SELECT u.ID, i.id, i.name, i.more, i.author
  
 FROM [USER] u INNER JOIN followers f
 ON u.id = f.id_user
 INNER JOIN items i 
 ON i.author = f.author
 
 WHERE u.name = 'admin'
0

Dzięki faktycznie teraz działa dobrze, możesz mi jeszcze odpowiedzieć na pytanie odnośnie idexowania? Czytałem ostatnio, że wyszukiwanie po indexach powoduje dużo szybsze wyniki oraz mniej obciąża sam serwer. Czy poprzez indexowanie ma na myśli jak zrobię np.
followers: | id_user | id_author

Czy dobrze rozumiem owe działanie?
Czy może lepiej będzie po prostu dać nazwy tzn.
followers: | admin | exampleAuthor
dzięki czemu nie muszę odpytywać tablice user
Który sposób będzie najlepszy, najwydajniejszy? A może inaczej należałoby to zrobić?

0

Dobrze czytałeś. Generalnie poruszanie się po indeksach jest najbardziej efektywne i należy zakładać indeksy na kolumny najczęściej używane w klauzuli "where" (oczywiście bez przesady nie może być tak, że każda kolumna będzie miała indeks).

Dużo tu opowiadać ... poczytaj: https://msdn.microsoft.com/pl-pl/library/baza-danych-sql-server--indeksy--kiedy-i-jak-je-stosowac.aspx

1 użytkowników online, w tym zalogowanych: 0, gości: 1