Nasıl tabloda son kayda katılabilirim?

1 Cevap php

Ne bitti ihtiyacım basit ... ama 03:00 ve Im muhtemelen belirgin bakan.

Basit bir forum kodlama Im. Ederken diğer mağazalar mesajlar bir tablo, vb forum başlıkları, açıklamaları, saklar. Forum listeleme, tüm forumların listesini gösterir, ben her forumda Son mesajı kapmak ve sonrası konu, afiş ve posta kimliği ve tarihi görüntülemek istiyorum. Basit.

Tek sorun, ben mesaj masaya katılmak zaman, bu forumda son mesajı göstermek hangi, son değil, tablodaki ilk kayda katılır, olduğunu.

Burada "son" yazı için forumlar + veri listesini alır basitleştirilmiş sorgu (şimdi hangi "ilk yazı" gibi fonksiyonlar).

SELECT forum_title, forum_id, post_subject, post_user, post_id, post_date FROM board_forums 
     LEFT JOIN board_posts 
     ON (forum_id = post_parentforum AND post_parentpost = 0) 
WHERE forum_status = 1
GROUP BY forum_id
ORDER BY forum_position

Bunu nasıl düzeltebilirim?

1 Cevap

Eğer vuruyorlar sorun klasik Ambiguous GROUP BY konudur. Diğer RDBMS (ve standart SQL) tüm şirketine izin vermez çünkü bu, MySQL için özel olduğunu. Eğer GROUP BY tüm olmayan toplu sütunları listede yok, çünkü sorgu, Tek-Değer Kural başarısız olur.

Burada grup başına büyük satır almak benim en sevdiğim yolu gösteren bir çözüm:

SELECT f.forum_title, f.forum_id, p1.post_subject, p1.post_user, 
  p1.post_id, p1.post_date 
FROM board_forums f
LEFT JOIN board_posts p1
  ON (f.forum_id = p1.post_parentforum AND p1.post_parentpost = 0)
LEFT JOIN board_posts p2
  ON (f.forum_id = p2.post_parentforum AND p2.post_parentpost = 0 
      AND p1.post_id < p2.post_id)
WHERE p2.post_id IS NULL AND f.forum_status = 1
ORDER BY f.forum_position;

p2.post_id IS NULL, olduğu bir yazı demektir p2 ki p1 bulunan sonrası daha büyük olduğu görülür.

Ergo, p1 (otomatik artan bir post_id varsayarak) son post.


Yorumunuz Re:

Bu ile hafif bir sorun. yüksek kimliği ile post_id mutlaka son bir mesaj değildir.

Problem yok. Sadece bir sonraki yazı bir önceki yazı ayırmak için garantili bir sütun kullanabilirsiniz. Sen söz post_date. Ilişkilerin durumda, kronolojik olmak için emin olacaktır başka bir sütun (veya sütunlar) ile bağlarını kırmak gerekir.

LEFT JOIN board_posts p2
  ON (f.forum_id = p2.post_parentforum AND p2.post_parentpost = 0 
    AND (p1.post_date < p2.post_date 
      OR p1.post_date = p2.post_date AND p1.post_millisecond < p2.post_millisecond))