PHP iki tablo ile yardım katılmak

4 Cevap php

Ben birlikte gitmek gibi sadece php öğrenme yaşıyorum ve ben tamamen kaybolmuş gibiyim. Gerçekten daha önce katılmak hiç kullanmadım, ve ben burada gerektiğini düşünüyorum, ama ben bilmiyorum. Kimsenin benim için bunu yapmak için bekliyor değilim ama sadece bana doğru yönde işaret eğer şaşırtıcı olurdu, ben katıldı kadar okuma çalıştı ama orada 20 farklı yöntem gibi ve ben sadece kayboldum ettik.

Temelde, el bir forum kodlu, ve gayet iyi çalışıyor ama verimli değildir.

Ben (mesajlar için) board_posts ve board_forums (forumlar için, kategoriler gibi bölümler) var.

Ben tekrarlamak ediyorum bölüm I index sayfası için son yazı için bilgi almak nasıl. Ben onu kurmak yolu katılır kullanmaktan kaçınmak olduğunu, orada "forum_lastpost_username / kullanıcı'kimliği için bir alan olurdu ben board_forums için tablo son yazı için bilgi depolamak, bu yüzden" Off Topic "denilen bir bölüm olduğunu söylüyor vb bir kullanıcı mesaj Ama bu kötü, ben dinamik olarak tüm kapmak ve bu alanlardan kurtulmak için çalışıyorum zaman güncellemek woudl / posttitle / PostTime ".

Şu anda benim sorgu tıpkı edilir:

`SELECT * FROM board_forums WHERE forum_parent='$forum_id''

Ve sonra ben orada son yazı için forumda (isim, açıklama, vb) ve tüm veriler için bilgi kapmak şeyler var:

	$last_thread_title = $forumrow["forum_lastpost_title"];
	$last_thread_time = $forumrow["forum_lastpost_time"];
	$lastpost_username = $forumrow["forum_lastpost_username"];
	$lastpost_threadid = $forumrow["forum_lastpost_threadid"];

Ama bundan kurtulmak ve board_posts onu almak gerekir. O board_posts kurmak oluyor yolu bir konu ise, post_parentpost bir cevap ise, o alan parçacığı (konunun ilk yazı) ait bir kimliği vardır, null olmasıdır. Yani, ben, son POST_DATE kapmak, parentpost null olursa null ise o zaman son yazılan yeni bir iş parçacığı (bkz, yani ben orada başlığı ve kullanıcının tüm bilgi alabilirsiniz yayınlanmıştır hangi kullanıcı görmek gerekir, ancak eğer o değil, o zaman ben bu kimliği bakarak ve ondan başlık alma, ne post_parentpost görerek bulunabilir ki parçacığı (ilk yazının bilgileri (başlık, id) almak gerekir.

Herhangi bir mantıklı mı? Eğer öyleyse bana yardım edin: (

Herhangi bir yardım büyük beğeni topluyor!!

4 Cevap

Sonrası ya da bir cevap takıldığında board___forums güncelleniyor - değil kötü bir fikir - performansıyla ilgili. Indeks sayfasını görüntülemek için sadece tek bir tablo board_forums verileri seçmek zorunda - katılmak zeki kullanırken bile bu, kesinlikle "son yazılar için bilgi" almak için ikinci bir tablo seçerek çok daha hızlıdır.

Sadece her eylem istatistikleri güncelleyerek daha kapalı, Yeni Mesaj, Mesaj vs Sil

Diğer örnekleri olasılıkla (bir ipliğin silme konu sayısında daha az bir konuyu göstermek için bir forum güncelleştirme tetikleyecek) herhangi istatistiklerini güncelleştirmeyi gerektirmez.

Kullanıcı yapardı tüm eylemleri hakkında düşünmek, çoğu durumda, herhangi istatistikleri güncellemek için ihtiyacım yok, bu nedenle, anında sayar almak çok verimsiz olduğunu ve bunu düşünmek hakkı vardır.

Zaten doğru olanı yaptık gibi görünüyor.

Eğer katılmak olsaydı, bunu şöyle yapardım:

SELECT * FROM board_forums
JOIN board_posts ON board_posts.forum_id = board_forums.id
WHERE forum_parent = '$forum_id'

Bu sorun, kullanışlı (ve çok yavaş) olmadığı, bu every post sizi alır olmasıdır. Ne want yapmak istiyorum böyle bir şeydir

SELECT * FROM board_forums
JOIN board_posts ON board_posts.forum_id = board_forums.id ORDER BY board_posts.id desc LIMIT 1
WHERE forum_parent = '$forum_id'

SQL böyle çalışmıyor hariç. Sipariş veya katılmak (veya bunun gibi diğer pek çok yararlı şeyler yapmak) sınırı, böylece her satır getirme ve sonra da (hangi berbat) kod bunları taramak zorunda değildir.

Kısacası, merak etmeyin. Kullanımı Eğer bir vuruşta tüm forumları ve bütün Mesajları yüklemek istiyorum fiili durumda katıldı.

Eğer zaten keşfedilmiş konum olarak basit bir çözüm, çok sayıda sorgular, bazı isteğe neden olur.

Bunun klasik yaklaşım sonuçlarını önbelleğe ve sadece arada bir onu almak için. Önbellek uzun yaşamak zorunda değildir; Yoğun bir sitede bile iki ya da üç saniye önemli bir fark yaratacak.

Zaten zaten okuyorsanız bir tabloya verileri de-normalize yardımcı olacaktır. Bu yaklaşım, isteğe bağlı sorguları sergiyi ve insert zaten oluyor zaman sadece bir güncelleme bulunuyor çünkü ucuz bir galibiyetle biraz olabilir kaydeder. Ama bu uygulama bazı veri bütünlüğü kaydırır.

Bir kenara, size parçacığı ile özyinelemeli sorgu sorun haline çalışıyor olabilir. Eğer bir "basit" algorithim kullanırsanız ilişkisel veritabanları tüm bu iyi heirarchical veri depolamak değil. Daha iyi bir yol, bazen 'set ağaçları' denilen şeydir. Ne yazık ki, Google'a biraz zor, bu yüzden here are some links.