Bir Tablo Seç Ve başka From Toplam Değer Dahil

4 Cevap php

Benim başlık korkunç ama ben bu kafamın etrafında sararak bir sabit zaman yaşıyorum. İki tablo var. Bağlantılar ve oylar. Linkler gönderilen linkleri ve olağan caz hakkında bilgi içeren, oy bir yabancı anahtar link_id ve karma_up ve karma_down değerini (imzasız ints ikisi) içerir. Ben kullanıcı ve rekor oy zaman başına birine oy sınırlamak istiyorum çünkü ben iki tablo yöntemi seçti. Ne olsa yapmak istiyorum bir bağlantı sum'ed karma görüntüler olduğunu. Ben SUM (- karma_down karma_up) kadar sum'ed tüm bağlantıları ve daha sonra bir çok için oy kapmak gerekiyor. Ben yapmak mümkün olmuştur Hepsi bana herhangi bir iyi yapmaz tüm sütunu yukarı toplamıdır.

Umarım birisi sadece ben yapmaya çalışıyorum ama o zamana kadar ben mümkün olduğunca ilgili bilgileri bu yazı güncelleme ne olacağını "alır".

UPDATE For anyone interested, my final query is

SELECT links.*, (SUM(karma_up) - SUM(karma_down)) AS karma
FROM links, votes
WHERE links.id = votes.link_id
GROUP BY votes.link_id

4 Cevap

Emin olmak için şema sonrası olabilir, ama böyle bir şey çalışması gerekir

select v.link_id, (sum(karma_up) - sum(karma_down)) as points from 
Links l, Votes v
where l.link_id = v.link_id group by v.link_id

Bu size link_id başına puan vermelidir.

Böyle bir şey yapmanız gerekir:

SELECT Links.LinkId, SUM(Votes.karma_up) - SUM(Votes.karma_down) AS karma FROM Links
    LEFT JOIN Votes ON Links.LinkId = Votes.LinkId
    GROUP BY Links.LinkId

SOL kullanımı oyların olmadan bağlantıları da dahil olmasını sağlamak için JOIN unutmayın.

Bahsetmek istiyorum Sadece bir şey daha. Bir oy (açıklanmasından olası) aynı anda hem yukarı ve aşağı karma için izin sürece, bunları yerine kapalı daha iyi olurdu karma_up ve karma_down, tek bir {[(ile 2)]} sütun. Sonra sırasıyla aşağı veya yukarı olup olmamasına bağlı olarak -1 veya 1 olarak ayarlayın.

Bu daha da sorgu basitleştirmek olacaktır:

SELECT links.*, SUM(karma_delta) AS karma
FROM links, votes
WHERE links.id = votes.link_id
GROUP BY votes.link_id

Hiç oy varsa bağlantı kimliği, ve sıfır karma başına Puan:

select l.*, coalesce(sub_karma, 0) as karma
from links as l
    left join (
        select link_id, sum(karma_up - karma_down) as sub_karma
        from votes
        group by link_id
    ) as v using (link_id)
;