Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: łączenie warunkowe
Forum PHP.pl > Forum > Bazy danych > MySQL
AxZx
mam tabele, w której są 2 kolumny, w których są ID profili.
chciałbym teraz wyświetlić dane z tej tabeli oraz dołączyć tabele profil ale dołączyć tylko do jednej kolumny. mam ID profilu, jeżeli w kolumnie nie ma tego ID to do tej kolumny ma być dołączona tabela ID profil.
jest takie coś w ogóle możliwe?

przykład:
profil: idprofil, login, nazwa
ob: id, idprofil, idprofil2

ob:
1, 50, 23
2, 23, 45
3, 34, 50

teraz zapytanie
pobranie maja byc wiersze ktore w tabeli ob idprofil = 50 OR idprofil2 = 50
dołączona ma być tabela profil
jeżeli idprofil != 50 to łączenie ob.idprofil = profil.idprofil
jeżeli idprofil2 != 50 to łączenie ob.idprofil2 = profil.idprofil

jest takie coś możliwe w mysql?
Zyx
O ile dobrze zrozumiałem Twoje intencje, to takie zapytanie zadziała:

Kod
SELECT ob.*, profil.* FROM ob, profil WHERE (ob.idprofil = 2 OR ob.idprofil2 = 2) AND profil.id = 2


Pobiera wiersze z "ob", które w jednym z pól ID mają wartość "2" i dokleja do nich odpowiedni wiersz z "profil".

Nie chcę za bardzo wnikać, skąd Ty wytrzasnąłeś takie dziwne potrzeby, ale jeśli ma to działać w ten sposób, to ja bym pobrał wiersz z "profilu" jednym zapytaniem, a z "ob" drugim.
AxZx
  1. AND profil.id = 2

to wskazuje, że ma być pobrany profil o ID = 2.
a właśnie nie o to chodzi. chodzi o to, że chce dołączyć profil, którego ID nie znam - ma być pobrane z tabeli ob.
i to jest właśnie zagadka, bo czasem to nie znane ID będzie w kolumnie idprofil a czasem idprofil2.

a taką potrzebne wytrzasnąłem z potrzeby wyświetlenia np kontaktów lub poczty.
kontakty działają u mnie na takiej zasadzie, że ja mogę zapraszać, jak również ja mogę być zaproszony. więc w zależności od tego czy zapraszam czy jestem zapraszany będzie moje ID w kolumnie idprofil lub idprofil2.
a w spisie kontaktów mają być po prostu kontakty wyświetlone, nie ważne kto zapraszał.

możliwe, że coś źle to zaprojektowałem (strukturę bazy), taki był mój pierwszy pomysł na szybko. zaraz jade na łono natury, przemyśle sprawę:)
LBO
Ja bym to załatwił dodatkową tabelą z typem związku i kluczem obcym do tabeli z profilami.
AxZx
a jak dokładniej?
nie mogę sobie tego jakoś wyobrazić, najlepiej by było zrobić tak, że było to w miarę optymalnie zrobione, żeby w symfony łatwo było to obsługiwać. na razie rozwiązałem to tak że pobieram dwoma zapytaniami i wyświetlam na stronie kontakty, które ja zaprosiłem i kontakty z zaproszenia innych osób. a chciałbym to w jedną listę połączyć, najlepiej jednym zapytaniem bo jeszcze trzeba pagera dorzucić.
LBO
Hmmm, może się obyć bez radykalnej zmieniania struktury.

A powiesz na flagę w tabeli ob. Tzn klucz obcy do tabeli profili jest zasze w kolumnie idprofil, ale za to masz dodatkową kolumnę, która flaguje powiązanie (zapraszający, zaproszony)?
AxZx
hmm trochę skrótowo piszesz. smile.gif
nie wiem czy chodziło Ci o to, żeby była tylko jedna kolumna z idprofilu?
jeżeli tak, to raczej nie może tak być bo musi być wiadome do kto jest tym kontaktem i kto ma tą osobę w swoich kontaktach.
dodatkową kolumnę z info o tym jaka jest relacja kontaktów mogę dołożyć, ale co to da? tak samo będzie trzeba jakiś warunek robić, żeby odpowiednio połączyć.
LBO
Wiesz co - dochodze do wniosku, że nie chyna rozumiem natury problemu i nie wiem co chcesz osiągnąć sad.gif
Czy mógłbyś jeszcze raz to opisać, najlepiej "jak krowie na rowie" smile.gif Bez podawania struktury tabel.
I sie zastanowimy jeszcze raz.

Pozdrawiam, Alan
AxZx
to może nie będę opisywał jak ja widzę rozwiązanie tylko napisze co ma być zrobione:)
kontakty
nic szczególnego:)

jest sobie user, który przegląda profil innego usera. tam klika link dodaj do kontaktów.
jeżeli ten drugi profil zaakceptuje zaproszenie do kontaktów to Ci dwaj użytkownicy mają jeden nowy kontakt - siebie nawzajem:)

jeżeli user wejdzie na stronę kontakty zobaczy spis kontaktów - wszystkich. czyli tych userów do których sam wysłał zaproszenie i również tych userów, którzy jemu wysłali zaproszenie.

wydaje mi się, że jest potrzeba odróżnienia podczas zapisywania w bazie, kto kogo zapraszał. bo zaproszenie oczekuje na akceptacje, więc musi być wiadomo kto ma zaproszenie zaakceptować.
oczywiście jest flaga czy zaproszenie jest już zaakceptowane.
LBO
Już wiem o co biega. chciałbyś sprawę kontaktów i zaproszeń załatwić w jednej tabeli smile.gif olej Ci mówię.

Tabela users - dane użytkowników/profili etc.
Tabela contacts - znajomi/kontakty. Czyli standardowo id usera i id jego kumpla (I tak! Robisz dwa zapytania kiedy zaproszenie zostaje przyjęte - dopisujesz rekord dla zapraszającego i zaproszonego).
Tabela invitations - zaproszenia. Identyfikatory zapraszającego i zapraszanego jak i flaga np. bitowa (przyjete/nieprzyjete).. i co tam jeszcze zapragniesz (created_at. ...).

Jak widzisz, wyciagniecie kontaktow to pryszcz. A jeżeli chcesz wiedzieć jaka jest relacja między użytkownikami (też proste bo zaproszony/zapraszajacy) to możesz sobie jakimś outer joinem dołaczyc invitations.

Uff, mam nadzieję, że pomogłem.

PS. Jak widzisz invitation nie są kasowane i na tej podstawie tą wcześniejszą relacje między uzytkownikami określasz. Możesz jednak po przyjęciu zaproszenia skasować odpowiedniezaproszenie i dodać dodatkową kolumnę do contacts gdzie tą relację bedziesz trzymał jako flagę. Jeszcze prostsze rozwiązanie.
AxZx
chyba zrozumiałem:)
zabieram się do reorganizacji:)
dzięki.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.