Autor Zpráva
gardener
Profil
Zdravím všechny,

mám jeden dotaz.

Mám tabulku vzájemných přátelství u uživatelů.

Předpokládejme, že má následující strukturu:
|ID | user_id | friend_id | status |

A naplníme ji jednotlivými hodnotami

|1 | 10 | 30 | 1 |

|2 | 20 | 10 | 1 |


Předpokládejme také, že jsem přihlášen v systému a moje uživatelské ID je 10.

Pokud si dám vyhledat všechny uživatele které mám v přátelství.

//BUDU PSÁT PSEUDO KÓD, DĚLÁM TO ZA POMOCÍ CAKEPHP, TAKŽE ZDE NEPOUŽÍVÁM KLASICKÝ SQL QUERY

SELECT * FROM TABLE FRIENDSHIPS 
WHERE Friendship.user_id = MOJE.ID 
NEBO 
WHERE Friendship.friend_id = MOJE.ID 
A Friendship.friend_status = 2


Dostanu sadu zaznamu..
NECO ve smyslu

 
  [0] => Array
        (
            [Friendship] => Array
                (
                    [ID] => 0
                    [DELETED] => 0
                    [user_id] => 10
                    [friend_id] => 31
                    [message] => Ahoj 
                    [date_of_send] => 2010-05-23 11:09:57
                    [friend_status] => 2
                )

            [User] => Array
                (
                    [ID] => 10
                    [DELETED] => 0
                    [nick] => 
                    [firstname] => Jiri 
                    [surname] => BLA
                    [address_id] => 70
                    [password] => 7ee68fd8
                    [date_of_birth] => 2010-11-24
                    [income_id] => 1
       
                )

        )


a ja bych chtel docilit pomoci SQL dotazu toho, pokud se user_id z tabulky friendships rovna ID aktualniho prihlaseneho uzivatel, tak JOINEM propojit na tabulku users ale pres sloupec friend_id, tak abych ziskal info o uzivateli, ktereho mam za pratele a ne o me samem.

Zkousel jsem nejake query dat dohromady ale jelikoz bude obsahovat zrejme slozitejsi podminku a tu ja nedokazi v Caku nasimulovat, tak jsem narazil na mrvy bod.


Kdyby někdo věděl, byl bych moc vděčný a snad by to pomohlo i dalším.
Joker
Profil
gardener:
Kde je problém? Nevidím na tom nic složitého. Podmínka je triviální, místo aby se id z tabulky users párovalo v tabulce friendship se sloupcem user_id, bude se prostě párovat s friend_id

Něco jako:
SELECT sloupce FROM users u join friendship f on u.id = f.friend_id WHERE f.user_id=$id OR f.friend_id=$id
gardener
Profil
Ale to mi prave vrati informace i o uzivateli s ID 10, co jsem ja, tady by bylo potreba prochazet sadu zaznamu , porovnavat user_id a když to budu já, tj. user_id=10, tak načíst pro tuto iteraci údaje o uživateli podle ID ze sloupce friend_id.

Je tam tedy třeba nějaké procházení cyklem a podmínka.
Joker
Profil
gardener:
Aha, jasně, ID uživatele může být v jakémkoliv ze sloupců.
I tak by to ale nebylo tak složité:
SELECT sloupce FROM users u join friendship f on u.id = IF(f.user_id=$id, f.friend_id, f.user_id) WHERE f.user_id=$id OR f.friend_id=$id
Kajman_
Profil *
Možná by bylo o fous výkonější nepsat if podmínku do joinu, ale použít union

SELECT sloupce FROM users u join friendship f on u.id = f.friend_id WHERE f.user_id=$id
UNION
SELECT sloupce FROM users u join friendship f on u.id = f.user_id WHERE f.friend_id=$id AND f.friend_status=2

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0