Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> left join do 3 tabel, relacja wiele do wielu
damiankopiec
post
Post #1





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 23.02.2009
Skąd: Jelenia Góra

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


Witam,

Posiadam w bazie trzy tabele:

- newsletter_recipient ( PK recipient_id ) - adresaci newslettera
- newsletter_campaign ( PK campaign_id ) - kampanie mailingowe
- newsletter_campaign_recipient ( FK recipient_id i campaign_id ) - zarzadza relacją adresat-kampania ( w tej tabeli przydzielam konkretnych adresatów do kampani )

Chodzi o to że chciałbym pobrać adresatów, którzy nie są przydzieleni do danej kampani ( powiedzmy że ta kampania ma campaign_id=2 )

Pobranie użytkowników, którzy nie są przydzieleni do żadnej kampani nie sprawia mi problemów, ale ta relacja jest troszkę trudniejsza i przyznam szczerze że się na niej konkretnie wykrzaczyłem wstydnis.gif

Wiem że na tym forum znajdują się osoby o wiele bardziej wyskilowane w sql'u niż ja, dlatego proszę Was o pomoc


--------------------
Freelancer Symfony/PHP poszukuje ciekawych zleceń
Warsztat: Slackware-current, NetBeans 6.8, Symfony-1.4.x, jQuery, 960gs
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
artega
post
Post #2





Grupa: Zarejestrowani
Postów: 174
Pomógł: 42
Dołączył: 22.07.2007
Skąd: /dev/random

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


  1. SELECT newsletter_recipient.* FROM newsletter_recipient JOIN newsletter_campaign_recipient ON (newsletter_recipient.recipient_id = newsletter_campaign_recipient.recipient_id) WHERE newsletter_campaign_recipient.campaign_id <> 2
Go to the top of the page
+Quote Post
damiankopiec
post
Post #3





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 23.02.2009
Skąd: Jelenia Góra

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


Dzięki za pomoc, ale... to chyba nie to o co mi chodzi.

Artega Twoje zapytanie złączy mi tabele z adresatami z tabelą w której trzymam relacje adresat-kampania, a potem pobierzez wiersze, które są rózne od 2, czyli pobierze adresatów, którzy nie należą do kampani nr 2 ( a więc wszystkich pozostałych ).

Wydaje mi się że trzeba użyć dwóch left joinów ( możliwe że się mylę ), żeby złączyć te tabele ze sobą, a później pobrać wiersze dla których recipient_id w tabeli newsletter_campaign_recipient równe jest NULL.

Podobnie jak ma się to w przypadku, pobierania użytkowników, którzy nie są przydzieleni do żadnej kampani:
  1. SELECT * FROM newsletter_recipient LEFT JOIN newsletter_campaign_recipient ON ( newsletter_recipient.recipient_id=newsletter_campaign_recipient.recipient_id )
  2. WHERE newsletter_campaign_recipient.recipient_id IS NULL

Z tym, że te zapytanie łączy jedynie tabele newsletter_recipient z tabelą newsletter_campaign_recipient, a mi chodzi o połączenie jeszcze dodatkowo tabeli newsletter_campaign.

Czy jest ktoś na forum kto może mi pomóc? Będę bardzo wdzięczny

Nie jestem do końca pewny, ale chyba udało mi się ugryźć temat, dzięki artkułowi http://www.tonymarston.net/php-mysql/many-to-many.html wykombinowałem coś takiego:
  1. SELECT *
  2. FROM newsletter_recipient
  3. CROSS JOIN newsletter_campaign
  4. LEFT JOIN newsletter_campaign_recipient ON (
  5. newsletter_campaign_recipient.recipient_id = newsletter_recipient.recipient_id AND newsletter_campaign_recipient.campaign_id = newsletter_campaign.campaign_id)
  6. WHERE newsletter_campaign_recipient.recipient_id IS NULL AND newsletter_campaign.campaign_id=2

Póki co na razie chodzi i zwraca prawidłowe wyniki.

Ten post edytował damiankopiec 24.09.2009, 09:00:26


--------------------
Freelancer Symfony/PHP poszukuje ciekawych zleceń
Warsztat: Slackware-current, NetBeans 6.8, Symfony-1.4.x, jQuery, 960gs
Go to the top of the page
+Quote Post
plurr
post
Post #4





Grupa: Zarejestrowani
Postów: 175
Pomógł: 12
Dołączył: 28.06.2007
Skąd: Bytom

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


Na moje oko coś takiego powinno dać ten sam efekt, przetestuj bo jestem ciekawy winksmiley.jpg

  1. SELECT nr.* FROM newsletter_recipient nr
  2. JOIN newsletter_campaign_recipient ncr ON ncr.recipient_id = nr.recipient_id
  3. JOIN newsletter_campaign nc ON nc.campaign_id = ncr.campaign_id
  4. WHERE ncr.campaign_id <> 2 AND ncr.recipient_id IS NULL


ps/ nie zapomnij o indexach

/edit/ w sql na is null - swoja droga chyba nie do końca wiem co chcesz osiągnąć

Ten post edytował plurr 24.09.2009, 09:15:33


--------------------
Wyobraźnia bez wiedzy może stworzyć rzeczy piękne.
Wiedza bez wyobraźni najwyżej doskonałe.

Albert Einstein
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 21.08.2025 - 04:19