v2.5.2
Giriş yap

Bir sohbette son mesajı getirme | SQL

seytan
440 defa görüntülendi ve 1 kişi tarafından değerlendirildi

(not) aşağıda kayıtlar için tablo kullanmayı denedim çıktısı kötü oldu. Düzenlerken çalışıyordu..

Arkadaşlar selam,

Ödevim için bir proje geliştiriyorum.Sosyal medya platformu.Basit çapta ama beklenen tüm işlemler gerçekleşiyor.
Projemin bir kısmında sohbet sayfası bulunuyor.
Klasik tasarım sol kısımda kişiler sağ kısımda mesajlar.

Sol kısımda görünecek bilgiler; sohbet edilen kişilerin avatarı, tam isimleri ve son mesaj. WhatsApp Web'in tasarımı gözünüze gelsin.

mesaj tablomun alanları:

&kaynak
&hedef
icerik
resim
okundu
&tarih

örnek bir mesaj tablosu kayıtları:
kaynak | hedef | icerik | resim |okundu | tarih
-- | -- | -- | -- | -- | --
1 |2 | mesaj 1 | null| 0| 2021-05-18 10:00
2 |1 | mesaj 2 | null| 0| 2021-05-18 10:01
2 |1 | mesaj 3 | null| 0| 2021-05-18 10:02
1 |3 | mesaj 4 | null| 0| 2021-05-18 10:10

(1 nolu üyenin kendinizin olduğunu varsayın.)

sohbetler = $this->Main_model->querySQL2('
    SELECT 
      m.*, u.no, u.avatar, u.tam_ad
    FROM 
      mesaj m, uye u
    WHERE 
      m.hedef = u.no AND 
      m.tarih IN 
        (
          SELECT MAX(tarih) as maxTarih
          FROM mesaj 
          WHERE kaynak = ? OR hedef = ?
          GROUP BY hedef
        )
    ORDER BY m.tarih DESC

  ',
  array($this->ben->no,$this->ben->no)
);

örnek çıktı.
kaynak | hedef | icerik | resim |okundu | tarih
-- | -- | -- | -- | -- | --
1 |2 | mesaj 1 | null| 0| 2021-05-18 10:00
2 |1 | mesaj 3 | null| 0| 2021-05-18 10:02
1 |3 | mesaj 4 | null| 0| 2021-05-18 10:10

yukarıdaki kod parçası çalışıyor fakat görüldüğü üzere aynı sohbette hem benim son mesajımı hemde karşı tarafın son mesajını getiriyor. bunun sebebi WHERE kaynak = ? OR hedef = ? satırı ve gruplama yapmam. bu satırda sadece kaynak kullanırsam sadece benim son mesajım geliyor. sadece hedef kullanırsam mesaj attığım kişinin son mesajını görebiliyorum.

soru gelsin...

ben istiyorum ki (içinde benim bulunduğum WHERE kaynak = 1 OR hedef = 1 durumu) bir sohbette sadece son atılan mesaj görünsün.

////// GÜNCELLEME //////

SQL kısmında bir cevap bulamadım ama kabaca bir çözüm buldum. Her sohbet için bir kod oluşturdum. ve gruplamayı buna göre yaptım.
mesaj tablosuna bir alan ekledim kod adında.

Yukarıdaki örneğe göre:
1 -> 2 || 2 -> 1 sohbetinde a1 kodu özel olarak tanımlandı.
1 -> 3 || 3 -> 1 sohbetinde a2 kodu özel olarak tanımlandı.

bu koda göre gruplama yapınca WHERE kaynak = 1 OR hedef = 1 durumunda o sohbetin son mesajını alabiliyorum.

yine de cevaplarınızı bekliyorum.

Cevap yaz
Cevaplar (2)
seytan
1662 gün önce

@makifgokce cevap için teşekkürler ama istediğimi alamadım.
Ek olarak bir alan ekledim veritabanına. Sadece o sohbet için üretilmiş bir token. Onun ile gruplama yapıyorum. Şuan düzenlemeleri yapıyorum işe yarar ise buraya nasıl yaptığımı yazacağım.
fakat sql kısmında bu sorun çözülürse daha güzel olur. Her türlü cevaba açık olduğumu belirteyim.

makifgokce
1662 gün önce

bu şekilde denermisin

ORDER BY UNIX_TIMESTAMP(m.tarih) DESC LIMIT 1