MySQL: bağlantıların bir sorguda geçerli kullanıcının oylamayı Çekme

2 Cevap php

Yani benim linkleri ve oy tablodan çeker bu sorgu var ve ben verilerin son bir sütun gerekir. Benim oy tablo her kullanıcının oylama oluşur, bir kullanıcı sadece bağlantı başına bir kez oy ve onların oy değeri -1, 0 veya 1 ya da olduğunu. Oy tabloda User_id yabancı anahtar var ve ben bir şekilde geçerli kullanıcının oy toplamak istiyorum . Ben mevcut sorgu karmaşıklığı ikinci bir sorgu gerektirebilir hissediyorum ama ben gerçekten mümkünse önlemek istiyor. Ben sadece kullanıcının oylamasında açmış geçerli olduğunu bilmek gerekir. Bir kullanıcı sadece bir kez linke oy çünkü bir bağlantı birden fazla oy değere zorunda kalmayacaksınız.

Bir kaç not

  1. Tüm bağlantılar, geçerli kullanıcı tarafından en az bir oy girişi ile otomatik olarak başlar
  2. Bu oylama seçimini kaldırır sonra bir linke oylama Bir kullanıcı 0 delta ile bu oy girişi devam edecektir

SQL:

SELECT links.*, (SUM(votes.karma_delta)) AS karma
FROM links, votes
WHERE links.id = votes.link_id
GROUP BY votes.link_id
ORDER BY (SUM(votes.karma_delta) - 1) / POW((TIMESTAMPDIFF(HOUR, links.created, NOW()) + 2), 1.5) DESC
LIMIT 0, 100

Optimizasyonu büyük olsa da, şu anda sadece belirli bir kullanıcı tarafından karma_delta Seçilen bağlantıları almak istiyorum.

2 Cevap

Ben gerçekten soruyorsun ne emin değilim, ama siz zaten dönen ve sadece her bağlantı için geçerli kullanıcıya ait oyların toplamı ile çoğaltmak konum bilgilerini tutmak ister gibi geliyor.

Bu durum buysa, o zaman böyle bir şey yapmanız gerekir:

SELECT links.*, 
       SUM(votes.karma_delta) AS karma,
       SUM(
           IF(votes.user_id = current_user_id, 
              votes.karma_delta, 
              0)
          ) AS user_vote
FROM links, votes
WHERE links.id = votes.link_id
GROUP BY votes.link_id
ORDER BY (SUM(votes.karma_delta) - 1) / 
         POW(
              TIMESTAMPDIFF(HOUR, links.created, NOW()) + 2, 
              1.5
            ) DESC
LIMIT 0, 100

İşte bu hızlı yapabilir bir yoludur: Sık sık linklerin her biri için puanlar göstermek, ve sen çok sık linklere oy gerekiyorsa, ben şu şekilde veri yapısını denormalize ediyorum:

  • "Mevcut skor" denilen bağlantı masada bir sütunu oluşturma
  • Eğer oy tabloya bir değişiklik yaptığınızda, ayrıca geçerli puan güncellemek
  • Hiç senkronize çıkıyorum iki endişe varsa, "bütün oyların toplanması" ile mevcut skoru değerleri geçersiz kılar cini çalıştırın.

Daha sonra, bağlantıların her puanı gösteren mega hızlı; Tabii, burada ödeme yapıyorsanız maliyet oy zaman (eğer bir yerine iki ekler / güncellemeler yapıyoruz), yanı sıra bazı ekstra karmaşıklığı yer almaktadır.