2016-03-29 18 views
1

Not: Bu soruyu en baştaki başlıktan alıp vermediğimden emin değilim, çünkü bu konuda doğru yaklaşımdan emin değilim, ancak bu yana her yerde başka örnekler bulamadım. oldukça özel bir sorgu.SQL - GROUP BY maks. Değer BY

Yani, başka tablodaki mesajları (oy kayıtlarını Alakalı karşılık ( sütun user_id benzersiz bir sayı olarak tanımlanır) kullanıcıları tarafından oluşturulan oyu ile dolu olan bir tablo "oy", var "upvote" Kullanıcı arayüzünde her uygun mesaj).

Ben son oylama sırasına göre (datetime olarak) bu oy sıralamak her biri için oluşturulan niyetinde ( sütun POST_ID) gönderebilir ve bu nedenle, kaçınarak yinelenen POST_ID her birinin değerini döndürdü.

ben girişi aşağıdaki sorgu:

SELECT id, user_id, post_id, created, MAX(created) 
FROM votes 
GROUP BY post_id, user_id 
ORDER BY max(created) DESC 

Ve geri verilmesinde: Gördüğünüz gibi

Table: votes 

id | user_id | post_id |  created  | MAX(created) 
----+-----------+-----------+-----------------------+-------------------- 
115 | 1   | 42  | 2014-07-03 23:08:31 | 2016-03-07 12:08:31 
----+-----------+-----------+-----------------------+--------------------   
237 | 2   | 101  | 2014-02-13 23:05:14 | 2016-03-05 23:05:14   
----+-----------+-----------+-----------------------+-------------------- 
431 | 7   | 944  | 2014-10-22 22:58:37 | 2016-03-03 19:58:37 
----+-----------+-----------+-----------------------+-------------------- 
255 | 15  | 101  | 2014-02-15 14:02:01 | 2016-02-01 23:05:14 
----+-----------+-----------+-----------------------+-------------------- 
... | ...  | ...  | ...     | ... 

, yinelenen "101" POST_ID yoktur. Bu sorgunun sonucu, her bir user_id için maksimum oluşturulmuş süreye göre sıralama yapar; bu, posta_id'i 'leri, örn. En fazla oluşturulan süreye sahip olan "101" değerinin sadece post_id sütun değerine dalmak istediğimde, "101" sütun satırında iki post_id sütun satırı vardır (MAX (oluşturuldu)). o (maks döndürmez beri tarafından sadece grup I MAX göre sıralamak edemiyorum ( oluşturulan) POST_ID else if,

POST_ID ve sütunlar görünüşte gruplanmış edilmelidir user_id Her bir post_id için () oluşturuldu.

Oluşturulan maksimum süreyi geri döndürmeyen bu çoğaltılmış post_id değerlerini nasıl kaldırırım?

sonra ben Ne:

Table: votes 

id | user_id | post_id |  created  | MAX(created) 
----+-----------+-----------+-----------------------+-------------------- 
115 | 1   | 42  | 2014-07-03 23:08:31 | 2016-03-07 12:08:31 
----+-----------+-----------+-----------------------+--------------------   
237 | 2   | 101  | 2014-02-13 23:05:14 | 2016-03-05 23:05:14   
----+-----------+-----------+-----------------------+-------------------- 
431 | 7   | 944  | 2014-10-22 22:58:37 | 2016-03-03 19:58:37 
----+-----------+-----------+-----------------------+-------------------- 
... | ...  | ...  | ...     | ... 
+0

O zaman user_ID'ye göre gruplama. Yalnızca maksimum (oluşturma) düzeyindeyseniz ve aynı Post_ID'ye bağlı olduğu sürece bu maksimum (oluşturulan) veriler için hangi user_ID'nin döndürüldüğünü umursamıyorsanız, user_ID'ye göre gruplandırmayın. – xQbert

+0

Sadece post_id ile gruplandırırsam MAX (oluşturulmuş) olarak sıralayamıyorum, her post_id için her bir post_id için max (yaratılmış) döndürmeyeceğinden, bu son post_id öğesinin user_id öğesiyle ilgilidir – user1228907

cevap

1

yalnızca her yazı için son oyu istemek varsayarsak:

SELECT v.* 
FROM posts p 
JOIN votes v 
ON  v.id = 
     (
     SELECT id 
     FROM votes vi 
     WHERE post_id = p.id 
     ORDER BY 
       created DESC 
     LIMIT 1 
     ) 
+0

"oy vi" nedir? – user1228907

+0

Ayrıca, bu her oyun MAX (oluşturulan) döndürmez ve bir v.post_id = p.id – user1228907

+0

Aslında sanırım bu çalıştığı birden fazla vaka olacağı gerçeğini görmezden geliyor ... – user1228907

0

Eğer post_id düzenlenmiş son user_id almak için arıyorsanız, group by post_id denemek ve zamana göre sıralama (veya otomatik artışsa id). Eğer (user_id,time) için geçmişi gerekiyorsa myhistory sütun için kodda belirtildiği gibi

SELECT tbl.* , GROUP_CONCAT('(',tbl.user_id,',',tbl.created,')') as myhistory FROM 
    (SELECT id, user_id, post_id, created, MAX(created) 
    FROM votes 
    ORDER BY max(created) DESC 
    ) as tbl 
GROUP BY tbl.post_id 

Eğer group_concat işlevini kullanabilirsiniz.