Mysql - Jak ułożyć warunek w operacji select na podstawie danych z innej tabeli?

0

Witajcie!
Mam tabelę "Auth" a w niej kolumny ID, Login, Imie.

Kolejna część to tabela: PrivateMessage. Mam tam Login nadawcy i Login Odbiorcy oraz nazwę konwersacji. W jaki sposób ułożyć zapytanie, jeżeli chciałbym wyszukać wszystkie nazwy konwersacji w których występuje osoba o danym imieniu? Muszę się odnieść do tabeli Auth, Możecie dać mi chociaż słowo kluczowe jak zacząć tego szukać w google?

Aktualnie robię to tak, że wczytuję wszystkie wiadomości w których występuje zalogowany użytkownik:

SELECT DISTINCT `NazwaKonwersacji`, `WiadomoscOd`, `WiadomoscDo` FROM `Wiadomosci` WHERE `WiadomoscOd`="Login1" OR  `WiadomoscDo`="Login1" ORDER BY `NazwaKonwersacji`

Otrzymuję Login drugiego uczestnika rozmowy. Następnie w pętli wykonuję kolejne zapytania sprawdzając imię drugiego użytkownika w tabeli Auth:

SELECT `Imie` FROM `Auth` WHERE `Login`="Login2"

Jeżeli imię spełnia wymagania dodaję je do listy i po wykonaniu pętli zwracam listę.
jak to zrobić za pomocą jednego zapytania? Da się tak w ogóle?

2

Poczytaj o joinach.

3
gswidwa napisał(a):

Mam tam Login nadawcy i Login Odbiorcy

a powinieneś mieć ID

0

mam ID, ale bazuję na loginach bo one i tak się nie powtarzają. A dla mnie tak jest się lepiej uczyć. jednak nie wszystko działa jak należy. Wróciłem do punktu wyjścia. Postaram się lepiej opisać kłopot, bo tu chyba samo INNER JOIN nie wystarczy:

Mam tabelę AUTH:

  1. ID
  2. Login
  3. Name

Oraz tabelę CONVERSATIONS:

  1. WhoCreated (Login z tabeli AUTH)
  2. WhoJoined (Login z tabeli AUTH)

W C# mam funkcję:

FindAllConversation_FindSecondUserByName(string FirstUserLogin, string SecondUserName);

Chciałbym ułożyć zapytanie, za pomocą którego znajdę LOGIN uczestników konwersacji za pomocą ich imienia, a następnie za pomocą obu loginów znajdę konwersacje
Tak znajduję listę Loginów odpowiadających imieniu

SELECT Login, FROM AUTH WHERE Name LIKE "%Paweł%"

Tych wyników może być wiele, ponieważ wielu użytkowników może mieć na imię np. Paweł.
Jeżeli mam dwa loginy, swój i uczestnika konwersacji to prosta sprawa:

SELECT WhoCreated, WhoJoined FROM CONVERSATIONS INNER JOIN AUTH ON (CONVERSATIONS.WhoCreated="User1" AND CONVERSATIONS.WhoJoined="User2") OR (CONVERSATIONS.WhoCreated="User2" AND CONVERSATIONS.WhoJoined="User1")

jak połączyć te dwa zapytania w jedno?

Przykład:

Tabela AUTH:

  1. User1 - Maciek
  2. User2 - Mateusz
  3. User3 - Paweł

tabela CONVERSATION:

  1. User1 - User2
  2. User2 - User1
  3. User1 - User3
  4. User2 - User3

Chcę wyszukać wszystkie konwersacje pomiędzy Loginem: User1 a imieniem zawierającym "Ma".
Wynik powinien być:

Frazę "Ma" w imieniu zawierają użytkownicy User1 (maciek) i User2 (mateusz)

OUTPUT:

  1. User1 - User2
  2. User2 - User1
0

Częściowo uzyskałem zadowalający mnie wynik

Dla tabeli AUTH: [ID, Login, Name]

  1. admin - Grigorij
  2. user - Grzegorz Świdwa
  3. user1 - Wojtek Szymański
  4. user2 - Paulina Wieszcz
  5. user3 - Piotr Łapiecki
  6. user4 - Wioletta Komorowska
  7. user5 - Marek Grajewski
SELECT DISTINCT `ConvFrom`, `ConvTo`, `ConvID`, `ConvTitle` FROM `Conversation` INNER JOIN Auth ON ConvFrom=Auth.Login OR ConvTo=Auth.Login WHERE ConvFrom=(SELECT `Login` FROM `Auth` WHERE `OtherInformation` LIKE "%Grze%") OR ConvTo=(SELECT `Login` FROM `Auth` WHERE `OtherInformation` LIKE "%Grze%")

https://imgur.com/a/YvAXVe8

jednak po wpisaniu frazy "%a%" wyskakuje błąd

https://imgur.com/a/is2l8MB

Nie chcę błądzić, czy ten artykuł to to, czego szukam?
http://dcx.sybase.com/1200/en/dbusage/ug-subquery-s-4318996.html

0

Boże kocham Was. Udało się!

SELECT DISTINCT `ConvFrom`, `ConvTo`, `ConvID`, `ConvTitle` FROM `Conversation` INNER JOIN Auth ON ConvFrom=Auth.Login OR ConvTo=Auth.Login WHERE ConvFrom IN (SELECT DISTINCT `Login` FROM `Auth` WHERE `OtherInformation` LIKE "%a%") OR ConvTo IN (SELECT `Login` FROM `Auth` WHERE `OtherInformation` LIKE "%a%")

https://imgur.com/a/EfVCGL4

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