Örnek üzerinden gidelim daha oturaklı olur.

Turgay, Ahmet ile konuşuyor. Turgay ile ahmet 'te arkadaş zaten arkadaş olmadan konuşabilme olayının olmadığını ön görüyorum.

Turgay'ın uye id'si = 86 olsun.

Sohbet üzerinden en son konuştuğu kişileri zaman sutununa göre filtremem gerekli.

select * from sohbet where kim = 86 order by zaman desc;

bu bana sohbet ettiğim kişilerin listesini sondan başa doğru verdi.

arkadaş tablosuna gerek varmı? sohbet özelliği için, zaten arkadaşlar birbirleri ile konuşabilir kısıtlaması uygulama bazında yapılmışken.. Ön görüm bu şekildeydi.

Konuşma barında arkadaşlarımıda göstermek istiyorsam.

şöyle bir yapı olmalı. arkadaş tablom üzerinde iki tane alan olmalı,

Arkadas tablosu lookup tablosu mantığında olmalı, ben uye_id'ye göre arkadas_id listesini aldığımda bana uye'nin tüm arkadaşlarını vermeli.

uye_id, arkadas_id

select * from uyeler where id in (select arkadas_id from arkadas where uye_id =86);

Arkadaşım olan uyeleri listeledim.

Şimdi sorunun cevabı ;

Arkadaşım olan kişileri zamana göre sondan başa göre listeleyelim. Burada sadece sohebt tablosu üzerinde daha önceden sohbet ettiklerimimi yoksa sohbet etmediklerimide listeyelim gibi soru oluşuyor. Ben etmediklerinide baz alıp, ona göre listeliyorum.

arkadas
uye_id arkadas_id
86 1
86 2
86 3

uyeler
id ad
86 turgay
1 ahmet
2 özlem
3 merve

sohbet
kim kime zaman
86 1 30ekim
86 2 1kasım
86 3 31ekim

Yukarıdaki şemaya göre bu şekilde rahatça üyeler listelenebilir. Ek olarak arkadaş kontrolü eklemek isterseniz bana göre saçma, çünkü arkadaş dışında sohbet edemez kontrolünü düşündüğümüzde.

select u.* from uyeler where id in (
select a.arkadas_id from sohbet s left outer join arkadas a on a.arkadas_id=s.kime
where s.kim = 86 order by s.zaman desc);


Eğer arkadaş dışında kimse ile konuşamaz kontrolü varsa,

sohbet tablosu direkt uyeler tablosu ile join edilmesi yeterli olacaktır.