• 06-05-2013, 17:28:32
    #1
    Kimlik doğrulama veya yönetimden onay bekliyor.
    Merhabalar.

    Bir soru-cevap sistemi üzerinde çalışıyorum. OOP mantığı ile götürüyorum.

    Soruların listelendiği bir sayfam var. Sorular, en son eklenen, en beğenilen, en çok görüntülenen vs şeklinde farklı şekillerde sıralanabilecek.

    Gerekli olan 4 tablomun adları questions, answers, categories, users.

    Her tablonun gerekli olan sütünları;

    questions
    ---q_id : Soru ID'si
    ---q_seo : Soru başlık seo hali
    ---q_title : Soru başlığı
    ---q_from : Soruyu soranın ID'si
    ---q_date : Sorulma tarihi
    ---q_category : Soru kategorisi
    ---q_date_unix : Soru tarihinin unix time formatındaki hali

    categories
    ---c_id : Kategori ID
    ---c_seo : Kategori adı seo hali
    ---c_name : Kategori adı

    users
    ---u_id : Kullanıcı ID
    ---u_username : Kullanıcı adı
    ---u_image : Kullanıcı imaj

    answers
    ---a_id : Cevap ID
    ---a_question : Cevabın bağlı olduğu soru ID'si

    Bu tablolar birbirlerine;
    q_category & c_id
    a_question & q_id
    q_from & u_id

    ile bağlılar.

    Ben şu sorgu ile sorulara, soruların bağlı olduğu kategorilere, soruları soran kişilere tek sorgu ile erişebiliyorum. Hatta her soruya karşılık gelen cevap sayılarını da alabiliyorum.

    SELECT
    questions.q_id, questions.q_seo, questions.q_title, questions.q_from, questions.q_date, questions.q_category, questions.q_date_unix,
    categories.c_id, categories.c_seo, categories.c_name,
    users.u_id, users.u_username, users.u_image,
    (SELECT COUNT(a_id) FROM answers WHERE a_question = questions.q_id) AS question_comment_count
    FROM
    questions
    LEFT JOIN categories ON questions.q_category = categories.c_id
    LEFT JOIN users ON questions.q_from = users.u_id
    Ben bu sorguyu 2 farklı şekilde daha çalıştıracağım.

    1. durum: 0 cevap sayısına sahip olan sorular
    Cevap sayısı 0 olan yani hiç cevap almamış olan soruları almak istiyorum. Şu şekilde bir kullanım denedim;

    SELECT
    questions.q_id, questions.q_seo, questions.q_title, questions.q_from, questions.q_date, questions.q_category, questions.q_date_unix,
    categories.c_id, categories.c_seo, categories.c_name,
    users.u_id, users.u_username, users.u_image,
    (SELECT COUNT(a_id) FROM answers WHERE a_question = questions.q_id) AS question_answer_count
    FROM
    questions
    LEFT JOIN categories ON questions.q_category = categories.c_id
    LEFT JOIN users ON questions.q_from = users.u_id
    WHERE question_answer_count=0
    Yani en sona WHERE question_answer_count=0 satırını ekledim. Şöyle bir hata aldım.

    Unknown column 'question_answer_count' in 'where clause' in
    1. sorum: Sadece cevap sayısı 0 olan satırları nasıl alabilirim?

    2. durum: Soruları cevap sayısına göre sıralamak istiyorum. Bunu nasıl sağlayabilirim. Yine kurabildiğim mantık şu şekilde.

    SELECT
    questions.q_id, questions.q_seo, questions.q_title, questions.q_from, questions.q_date, questions.q_category, questions.q_date_unix,
    categories.c_id, categories.c_seo, categories.c_name,
    users.u_id, users.u_username, users.u_image,
    (SELECT COUNT(a_id) FROM answers WHERE a_question = questions.q_id) AS question_answer_count
    FROM
    questions
    LEFT JOIN categories ON questions.q_category = categories.c_id
    LEFT JOIN users ON questions.q_from = users.u_id
    ORDER BY question_answer_count ASC
    Bu sorgu sorunsuz çalıştı. Bu durumda sormak istediğim şu.

    2. sorum: Bu kullanım doğru bir kullanım mıdır?

    Bu 2 konuda bana yardımcı olabilirseniz sevinirim. Şimdiden teşekkürler.
  • 07-05-2013, 13:57:14
    #2
    hocam sorguna fazla bakamadım ama mantığın doğru fakat ileride veritabanın kalabalıklaşmaya başladığında sıkıntı yaratacak bir sorgu. ilk önce sorulara bağlan, oradan cevaplarına geç, toplamını al, sıfır olanları göster.

    benim sana tavsiyem şu;

    sonuçta senin bir tane "questions" tablon var, bu "questions" tablona "q_answer_total" diye bir sütün daha aç, oraya o soru için verilmiş cevap sayısını yazdır.

    yani sorular tablondaki soru satırına o soru için verilmiş cevap sayısını da yazdır. tabii ilk soru açıldığında bu cevap sayısını "0" olarak belirt. böylelikle ne o kadar çok uzun sorgu yazmış olursun ne de tablolar arasında bağlantı yapıp, toplam alıp v.s. gibi uzun bir sorgu yazmamış olur ve daha hızlı dönüş alırsın. naçizane.
  • 07-05-2013, 13:58:16
    #3
    1. soru için

    WHERE SELECT'den önce çalıştırıldığı için direk öyle yapamazsın. Şöyle bir şey deneyebilirsin.

    SELECT
    questions.q_id, questions.q_seo, questions.q_title, questions.q_from, questions.q_date, questions.q_category, questions.q_date_unix,
    categories.c_id, categories.c_seo, categories.c_name,
    users.u_id, users.u_username, users.u_image,
    (SELECT COUNT(a_id) FROM answers WHERE a_question = questions.q_id) AS question_answer_count
    FROM
    questions
    LEFT JOIN categories ON questions.q_category = categories.c_id
    LEFT JOIN users ON questions.q_from = users.u_id
    HAVING question_answer_count > 0
  • 07-05-2013, 16:12:25
    #4
    fatihsarac adlı üyeden alıntı: mesajı görüntüle
    hocam sorguna fazla bakamadım ama mantığın doğru fakat ileride veritabanın kalabalıklaşmaya başladığında sıkıntı yaratacak bir sorgu. ilk önce sorulara bağlan, oradan cevaplarına geç, toplamını al, sıfır olanları göster.

    benim sana tavsiyem şu;

    sonuçta senin bir tane "questions" tablon var, bu "questions" tablona "q_answer_total" diye bir sütün daha aç, oraya o soru için verilmiş cevap sayısını yazdır.

    yani sorular tablondaki soru satırına o soru için verilmiş cevap sayısını da yazdır. tabii ilk soru açıldığında bu cevap sayısını "0" olarak belirt. böylelikle ne o kadar çok uzun sorgu yazmış olursun ne de tablolar arasında bağlantı yapıp, toplam alıp v.s. gibi uzun bir sorgu yazmamış olur ve daha hızlı dönüş alırsın. naçizane.
    _LosT_ adlı üyeden alıntı: mesajı görüntüle
    1. soru için

    WHERE SELECT'den önce çalıştırıldığı için direk öyle yapamazsın. Şöyle bir şey deneyebilirsin.

    SELECT
    questions.q_id, questions.q_seo, questions.q_title, questions.q_from, questions.q_date, questions.q_category, questions.q_date_unix,
    categories.c_id, categories.c_seo, categories.c_name,
    users.u_id, users.u_username, users.u_image,
    (SELECT COUNT(a_id) FROM answers WHERE a_question = questions.q_id) AS question_answer_count
    FROM
    questions
    LEFT JOIN categories ON questions.q_category = categories.c_id
    LEFT JOIN users ON questions.q_from = users.u_id
    HAVING question_answer_count > 0
    Cevaplar için teşekkürler.

    Her soruya bağlı cevap sayısını, questions tablosunda açacağım yeni bir q_answer_count sütunu ile tutacağım. Cevap eklenmesi yada silinmesi durumunda burayı güncelleyeceğim. Bu şekilde kullanımın doğru olacağında sanırım hemfikiriz.

    Ben soruları listeleyeceğim. Soruların yanında yorum sayısını bu şekilde alacağım. Soruyu soran ve sorunun kategorisi bilgilerini sorguda kullandığım şekilde almamda bir sorun var mı peki? Böyle mi yapsam daha doğru olur, yoksa soruların listeleneceği döngünün içinde her seferinde yeni bir sorgu ile soran ve kategori bilgilerini alsam mı daha doğru olur?