Oylama Script Veritabanı Sorgu basitleştirme imkanı

2 Cevap php

Ben belirli bir kullanıcı zaten bir yazı üzerinde oy belirlemek ve gelecekte bunları engellemek için, bir tablodaki post_id ve user_id depolayan bir oylama komut dosyası var.

Bunu yapmak için, ben şu 3 sorguları yapıyorum.

SELECT user_id, post_id from votes_table where postid=? AND user_id=?

Hiçbir satır döndürürse, o zaman:

UPDATE post_table set votecount = votecount-1 where post_id = ?

O zaman

SELECT votecount from post where post_id=?

Web sayfasında yeni votecount görüntülemek için

Bunu yapmak için daha iyi bir yolu? 3 sorgular ciddi kullanıcının oylama deneyimini yavaşlatan

Edit

  • Oy tabloda, vote_id bir birincil anahtar
  • Sonrası tabloda, Post_id bir birincil anahtardır.
  • Şeyleri hızlandırmak için başka önerileriniz?

2 Cevap

Siz ilk iki sorguları birleştirme:

UPDATE  post
SET     votecount = votecount - 1
WHERE   post_id = ?
        AND post_id NOT IN
        (
        SELECT  post_id
        FROM    votes_table
        WHERE   user_id = ?
        )

Hala üçüncü bir çalıştırmanız gerekir.

Eğer votes_table (user_id, post_id) ve post (post_id) benzersiz bir dizin veya bir PRIMARY KEY olduğundan emin olun.

Büyük olasılıkla, mevcut sorgu yavaşlık bu endeksleri yokluğu sebep olur.

Quassnoi cevabı her kullanıcı hiç değil içine oylanacak olan post_id çekerek sayesinde oldukça verimsiz oluyor.

UPDATE 
    dbo.Post
SET 
    VoteCount = VoteCount + 1 -- Must be +1 right? Not minus 1?
FROM
    dbo.Post p
WHERE
    NOT EXISTS
        (
        SELECT
            v.PostID
        FROM
            dbo.Votes_Table v
        WHERE
            v.PostID = p.PostID
        AND v.User_ID = ?
        )
WHERE
    p.PostID = ?

IF(@@ROWCOUNT = 1)
    PRINT 'No previous vote, votes incremented'
ELSE
    PRINT 'User has already voted, votes not incremented'

Şahsen, ben ciddiye sonrası masaya bir vote_count sürdürmek yeniden istiyorum.