Geçen hafta ilk 10 nokta-gelirliler almak için MySQL sorgu?

3 Cevap php

Benim web uygulaması son 7 gün içinde en çok puan kazanan ilk 10 kullanıcıların kullanıcı kimlikleri döndüren bir sorgu yazmaya çalışıyorum.

Ben, birlikte, ihtiyacım olan bilgi var üç tablo var.

  1. votingapi_votes tablo. Bu bir yorum veya düğüm her yukarı / aşağı oylama için bir kaydı var.
  2. node tablo. Eğer oy almak hikayeyi yayınlanmıştır kim anlamaya böylece bir kullanıcı kimliği ile bir düğüm kimliği ilişkilendirebilirsiniz.
  3. Yorumlar için aynısını yapar comments tablo.

Ben votingapi_vote tablosundan geçen hafta bir açıklama veya düğüm her oy seçer bir sorgu yazmak gerektiğine inanıyorum.

İşte bu tablo yapısı:

  • vote_id
  • içerik_türü
  • content_id
  • değer
  • değer_type
  • etiket
  • uid
  • damgası

684000 - Yani içerik_türü "düğüm" veya zaman daha büyük bir Unix zaman damgası () ile "açıklama" satırları SEÇ ediyorum.

Sonra gerekiyor

  1. "content_id" ile grup bu oyları.

  2. Biz düğümleri ve yorum yapan bilmek çok ilgili "düğüm" her content_id için "User_id değerler" ve "yorum" tabloları bak.

  3. Onun düğümleri ve yorumlardan kazanılan her user_id toplam kaç puan hesaplayın.

  4. Sıralama bu User_id ters ve sadece ilk 10 görüntüleniyor sınırları içinde bunu en.

Vay. Ben ne yapmak gerekir gibi görünüyor. Şimdi gerçek sorgu bu ne benziyor?

3 Cevap

OMG Ponies' answer dayalı Gönderme

SELECT x.user_id, SUM(x.total_votes)
    FROM (
        SELECT n.user_id, SUM(vav.value) AS total_votes
            FROM NODE n
            JOIN VOTINGAPI_VOTES vav 
                ON vav.content_id = n.nid
                AND vav.content_type = 'node'
            WHERE vav.timestamp > NOW() - 684000
            GROUP BY n.user_id
        UNION
        SELECT c.user_id, SUM(vav.value) AS total_votes
            FROM COMMENTS c
            JOIN VOTINGAPI_VOTES vav 
                ON vav.content_id = c.cid
                AND vav.content_type = 'comment' 
            WHERE vav.timestamp > NOW() - 684000
            GROUP BY c.user_id
    ) x
    GROUP BY 
        x.user_id
    ORDER BY 
        x.total_votes DESC
    LIMIT 10

Önceki kod ile sorun düğüm için Yorumlarınız, 1 kullanıcı, 1 başına 2 satır döndürür olmasıdır. Bu kodu başka bir SUM kullanıcı başına sadece 1 sayı bunu toplamak için yapacağız.

Kullanın:

SELECT x.*
  FROM (SELECT n.user_id,
               SUM(vav.value) 'total_votes'
          FROM NODE n
          JOIN VOTINGAPI_VOTES vav ON vav.content_id = n.nid
                                  AND vav.content_type = 'node'
         WHERE vav.timestamp > NOW() - 684000
      GROUP BY n.user_id
       UNION
       SELECT c.user_id,
              SUM(vav.value) 'total_votes'
         FROM COMMENTS c
         JOIN VOTINGAPI_VOTES vav ON vav.content_id = c.cid
                                 AND vav.content_type = 'comment' 
        WHERE vav.timestamp > NOW() - 684000
     GROUP BY c.user_id) x
ORDER BY x.total_votes DESC
   LIMIT 10

Sadece Views module kullanabilir miyim? Yapabileceğini eminim ...