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

Odpowiedz Nowy wątek
2018-09-02 02:15
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?

edytowany 1x, ostatnio: gswidwa, 2018-09-02 02:16

Pozostało 580 znaków

2018-09-02 03:44
2

Poczytaj o joinach.

dziękuję wszystko śmiga, dodatkowo zapewniłeś mi kolejną lekturkę bo trafiłem na fajną stronkę ;D - gswidwa 2018-09-02 05:25

Pozostało 580 znaków

2018-09-02 16:35
3
gswidwa napisał(a):

Mam tam Login nadawcy i Login Odbiorcy

a powinieneś mieć ID


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.

Pozostało 580 znaków

2018-09-02 20:36
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
edytowany 2x, ostatnio: gswidwa, 2018-09-02 20:41
Uczyłęś się praw DeMorgana? - Marcin.Miga 2018-09-02 20:53
odpowiadam: A co to jest? (zaraz sprawdzę, programuję w domku sobie dla przyjemności więc nie wszystkie pojęcia potrafię wyłapać) - gswidwa 2018-09-02 21:11

Pozostało 580 znaków

2018-09-02 21:17
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[...]ge/ug-subquery-s-4318996.html

edytowany 2x, ostatnio: gswidwa, 2018-09-02 21:29

Pozostało 580 znaków

2018-09-02 21:36
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

Koszmarnie niewydajne... - Marcin.Miga 2018-09-02 22:55
Wybacz, ale dopiero zaczynam MySQL, jeszcze niedawno zastanawiałem się jak użyć SELECT. Nie mam pieniędzy na naukę i bazuję na tym co znajdę tutaj lub w internecie, więc jeżeli masz zamiar pisać "koszmarnie niewydajne" zamiast napisać dlaczego to wsadź swoje uwagi głęboko wiesz gdzie. Wystarczająco sie ostatnio nasłuchałem demotywujących komentarzy :) - gswidwa 2018-09-03 03:31
Przecież nie słuchasz dobrych rad, więc po co ci je dawać? abrakadaber napisał, że powinieneś mieć ID i co? Używasz login... - Marcin.Miga 2018-09-03 06:18
To się wiąże również ze wszystkimi klasami w moim programie w WPF, więc musiałbym teraz wszystko znowu zmienić i zanim dojdę do tego momentu aby się tego nauczyć jak napisać te kwerende znowu by rok minął - gswidwa 2018-09-03 16:03

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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