• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Loginy występujące na dwóch domenach

Cloud VPS
0 głosów
725 wizyt
pytanie zadane 29 czerwca 2023 w SQL, bazy danych przez Blds Użytkownik (830 p.)

Mam tabelę customer z kolumną customer_id i domain oraz tabelę customer_user z kolumną customer_id i login. Potrzebuję znaleźć loginy, które powtarzają się zarówno na domenie x jak i y. Wiem, że takie loginy występują, ale to zapytanie tego nie pokazuje. Nie jestem pewny co do exists. czy nie trzeba tam jeszcze zrobić join z tabelą customer?

SELECT login,
               exists(SELECT 1
                          FROM customer_user as cu2
                          WHERE cu.login = cu2.login
                          AND c.domain = 'y') as dubel
FROM customer as c
INNER JOIN customer_user ac cu on cu.customer_c.customer
WHERE c.domain = 'x'

 

2 odpowiedzi

+2 głosów
odpowiedź 29 czerwca 2023 przez KacperKwinta Użytkownik (640 p.)

Kod, który podałeś, nie zawiera niektórych istotnych elementów, aby osiągnąć pożądany rezultat. Oto szczegółowy opis krok po kroku, jak rozwiązać ten problem:

1. Funkcja `EXISTS` w podzapytaniu jest używana do sprawdzenia, czy istnieje przynajmniej jeden wiersz spełniający określone warunki. Jednak w Twoim kodzie podzapytanie sprawdza tylko istnienie loginu w tabeli `customer_user` z domeną 'y'. Aby znaleźć loginy, które występują zarówno na domenie 'x', jak i 'y', musisz zmodyfikować podzapytanie, aby sprawdzić login w obu domenach.


   SELECT login,
          EXISTS(
              SELECT 1
              FROM customer_user AS cu2
              INNER JOIN customer AS c2 ON cu2.customer_id = c2.customer_id
              WHERE cu.login = cu2.login
                AND c2.domain = 'y'
          ) AS dubel
   FROM customer AS c
   INNER JOIN customer_user AS cu ON cu.customer_id = c.customer_id
   WHERE c.domain = 'x';

Ten zmodyfikowany kod łączy tabele `customer` i `customer_user` na podstawie kolumny `customer_id` i sprawdza loginy, które występują zarówno na domenie 'x', jak i 'y'.

2. Klauzula `INNER JOIN` służy do połączenia wierszy z tabel `customer` i `customer_user` na podstawie pasujących wartości kolumny `customer_id`. Zapewnia to, że w wyniku będą uwzględnione tylko wiersze z pasującymi wartościami `customer_id`.

3. Klauzula `WHERE` służy do filtrowania wierszy z tabeli `customer`, gdzie domena jest równa 'x'. Zapewnia to, że uwzględniane są tylko klienci z domeną 'x' w zapytaniu.

Dokonując tych modyfikacji, zapytanie powinno zwrócić loginy, które występują zarówno na domenie 'x', jak i 'y'.

komentarz 30 czerwca 2023 przez Blds Użytkownik (830 p.)
edycja 30 czerwca 2023 przez Blds
super, ten zapis zwrócił mi poprawne wyniki. Chiałem dopytać czy aliasy w funkcji EXISTS mogą mieć takie same aliasy jak w głównym zapytaniu czy nie? Ślicznie dziękuję!
1
komentarz 30 czerwca 2023 przez KacperKwinta Użytkownik (640 p.)
Aliasy w funkcji EXISTS mogą mieć takie same nazwy jak w głównym zapytaniu, ale nie jest to zalecane ze względów czytelności kodu.

Według dokumentacji MySQL, "aliasy można używać w klauzuli SELECT, aby nadać kolumnom lub wyrażeniom wynikowym tymczasowe nazwy. Aliasy można również używać w klauzulach FROM, WHERE i GROUP BY". Jednakże, jeśli aliasy są używane zarówno w głównym zapytaniu, jak i w podzapytaniu, może to prowadzić do niejednoznaczności i utrudniać zrozumienie kodu.

Aby uniknąć potencjalnych problemów, zaleca się używanie unikalnych aliasów w funkcji EXISTS, które nie powtarzają się w głównym zapytaniu. Na przykład, jeśli używasz aliasu "cu" dla tabeli "customer_user" w głównym zapytaniu, możesz użyć innego aliasu, na przykład "cu2", dla tej samej tabeli w funkcji EXISTS. To uczyni kod bardziej czytelnym i uniknie potencjalnych problemów z niejednoznacznością.
0 głosów
odpowiedź 30 czerwca 2023 przez Blds Użytkownik (830 p.)

Mam tu jeszcze jedno zapytanie na podstawie, którego budowałem swoje zapytanie. W tym query szukałem NIP, które się powtarzały na dwóch domenach. W tym przypadku zwróciło mi poprawne wyniki, a nie dostrzegam różnicy między tym zapytaniem, a zapytaniem o duplikaty loginów.

select
	     c.customer_id,
	     c.nip,
	     exists(select 1 from cenniki.customer c2 where c.nip = c2.nip and c.domain='www.abc.pl') as konto_abc
    from
        cenniki.customer c on c.customer_id = l.customer_id
	where
	    c.domain = 'www.xyz.pl'

 

1
komentarz 30 czerwca 2023 przez KacperKwinta Użytkownik (640 p.)

W Twoim przypadku, jeśli chcesz znaleźć duplikaty na podstawie kolumny nip w tabeli cenniki.customer, możesz zmodyfikować zapytanie w ten sposób:

SELECT c.nip, COUNT(*)
FROM cenniki.customer c
WHERE c.domain = 'www.xyz.pl'
GROUP BY c.nip
HAVING COUNT(*) > 1

To zapytanie zwróci duplikaty wartości nip i ich liczbę wystąpień. Jeśli chcesz pobrać cały rekord dla każdego zduplikowanego wiersza, możesz dołączyć wynik tego zapytania do tabeli cenniki.customer, używając kolumny nip. Oto przykład:

SELECT c.*
FROM cenniki.customer c
JOIN (
  SELECT nip, COUNT(*)
  FROM cenniki.customer
  WHERE domain = 'www.xyz.pl'
  GROUP BY nip
  HAVING COUNT(*) > 1
) duplikaty ON c.nip = duplikaty.nip
WHERE c.domain = 'www.xyz.pl'

To zapytanie zwróci wszystkie kolumny z tabeli cenniki.customer dla zduplikowanych wierszy na podstawie kolumny nip. Możesz dostosować nazwy kolumn i nazwę tabeli zgodnie z rzeczywistym schematem.

Podobne pytania

+1 głos
2 odpowiedzi 610 wizyt
pytanie zadane 8 lipca 2021 w SQL, bazy danych przez Kenzy Obywatel (1,160 p.)
0 głosów
0 odpowiedzi 654 wizyt
pytanie zadane 12 lutego 2020 w SQL, bazy danych przez franz Gaduła (4,940 p.)
0 głosów
1 odpowiedź 1,443 wizyt

93,460 zapytań

142,454 odpowiedzi

322,724 komentarzy

62,837 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...