Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Jak odrzucić wpisy po specyficznej relacji
Crash89
post 9.11.2022, 12:45:54
Post #1





Grupa: Zarejestrowani
Postów: 191
Pomógł: 7
Dołączył: 3.04.2013

Ostrzeżenie: (0%)
-----


Witam,

Pierwszy raz się natknąłem na taki problem.
Otóż mam sobie tabele A z połączeniem do tabeli B.

mam połaczenie A.name z B.name (w rzeczywistości jest poprzez id ale tutaj maksymalnie upraszczam).

Moim celem jest odrzucenie wpisów po wprowadzonej tablicy danych.

i problem jest tutaj gdy daje WHERE B.name IS NULL OR B.name NOT IN ($array) to owszem odrzuca ale tylko jesli tabela A ma dokładnie takie same połaczenia do tabeli b jak w tablicy.
Gdy jest jedno więcej połączenie co nie ma w wyrażeniu NOT IN to mi ten wpis pobiera z bazy.

Ogólnie zapytanie wygląda mniej więcej tak.

SELECT A.columns, B.columns FROM A LEFT JOIN B ON A.kolumna_z_b_id = B.id WHERE B.name IS NULL OR B.name NOT IN ($array).

Proszę o jakieś rozwiązanie.
Go to the top of the page
+Quote Post
Salvation
post 9.11.2022, 14:57:21
Post #2





Grupa: Zarejestrowani
Postów: 338
Pomógł: 70
Dołączył: 15.07.2014

Ostrzeżenie: (0%)
-----


Wybacz, ale chyba za bardzo uprościłeś, bo ja nawet po kawie nie umiem zrozumieć co chcesz osiągnąć.
Go to the top of the page
+Quote Post
Crash89
post 9.11.2022, 17:59:38
Post #3





Grupa: Zarejestrowani
Postów: 191
Pomógł: 7
Dołączył: 3.04.2013

Ostrzeżenie: (0%)
-----


Cytat(Salvation @ 9.11.2022, 14:57:21 ) *
Wybacz, ale chyba za bardzo uprościłeś, bo ja nawet po kawie nie umiem zrozumieć co chcesz osiągnąć.


Zatem rozpisze to:

Mamy 3 tabele:

Users
-user_id

tags:
-tag_id
-name

user_tags:
-id
-user_id
-tag_id


mamy dwóch: userów: id = 1, i id = 2.

mamy 3 tagi: [1, żółw], [2, pantera], [3, hipopotam].
(cyfra to tag_id a nazwa zwierzecia tag_name)


i w user_tags mamy wpisy:
1,1
2,1
1,2
2,3

pierwsza ta user_id a druga tag_id

czyli dla żółwia ma połączenie w obu userach.

i teraz chciłabym aby gdy wybiore z formularza tag pantera to aby nie pobierał mi użytkowników którzy maja ten tag.

Problem polega na tym że gdy wybiore ten tag to i tak mi wyświetli tego użytkownika bo ma powiązania z innym tagiem.
(wyswietlam wszystkie tagi jakie ma ten użytkownik)


Próbuję to rozwiązać w ten sposób

  1. SELECT u.*, GROUP_CONCAT(t.tag_name, SEPARATOR " ,") AS tags FROM users u LEFT JOIN user_tags ut ON u.user_id=ut.user_id LEFT JOIN tags t ON t.tag_id = ut.tag_id WHERE t.name NOT IN ($tags) OR t.name IS NULL;


i na kilka innych sposobów probowałem.
Niestety te wpisy które zawierają tylko tag pantera mysql odrzuci natomiast jesli zawiera ten tag i zawiera np. żółwia to go pobierze.
A chciałbym żeby te które zawierają połaczenie z pantera zostały odrzucane.
Mam nadzieję że wyjaśniłem zrozumiale o co mi chodzi smile.gif

Nie mogę tego zrobić po pobraniu danych i odfiltrować na poziomie PHP musi być podczas zapytania.

Ten post edytował Crash89 9.11.2022, 18:04:01
Go to the top of the page
+Quote Post
Salvation
post 9.11.2022, 23:14:56
Post #4





Grupa: Zarejestrowani
Postów: 338
Pomógł: 70
Dołączył: 15.07.2014

Ostrzeżenie: (0%)
-----


Próbowałbym w ten sposób:
  1. SELECT u.* FROM `users` u WHERE u.`id` NOT IN (SELECT ut.`user_id` FROM `users_tags` ut LEFT JOIN `tags` t ON ut.`tag_id` = t.`id` WHERE t.`name` = "pantera");
Go to the top of the page
+Quote Post
Crash89
post 10.11.2022, 11:41:57
Post #5





Grupa: Zarejestrowani
Postów: 191
Pomógł: 7
Dołączył: 3.04.2013

Ostrzeżenie: (0%)
-----


Cytat(Salvation @ 9.11.2022, 23:14:56 ) *
Próbowałbym w ten sposób:
  1. SELECT u.* FROM `users` u WHERE u.`id` NOT IN (SELECT ut.`user_id` FROM `users_tags` ut LEFT JOIN `tags` t ON ut.`tag_id` = t.`id` WHERE t.`name` = "pantera");

Ok dzięki o to mi właśnie chodziło.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 28.03.2024 - 14:34