Zaman uygulamak için en iyi yolu, PHP / MySQL tabanlı sıralama nedir?

3 Cevap php

Ben makalelerle dolu 1 tablo var. Bu yazının amacı için, sadece 4 alanlar vardır diyelim. story_id, STORY_TITLE, story_numyes, story_numno

Her makale EVET veya HAYIR olarak alınabilir. (Timestamp olarak) vote_storyid, vote_date, vote_code (1 = evet, 0 = hayır): I 3 alanlarını içeren başka bir tabloda her derece, saklamak.

Biri bir makale üzerinde evet oyu Yani, bu story_numyes 1 için bir güncelleştirme sorgusu yanı sıra 2. tabloda hikaye kimliği, tarihi ve vote_code oturum bir ekleme sorgusu çalıştırın.

Ben kaç EVET veya HAYIR oy dayalı yazılar sıralamak istiyorum. Değerlendirmesi "tüm zamanların en iyi" Açıkçası basit için .... story_numyes DESC ORDER BY.

Ama nasıl bu hafta bu ay, bugün en iyi / en kötü yazılar yapıyor hakkında gitmek istiyorsunuz?

Ben aşağıdaki yoluyla her dönem için cut-off tarihleri ​​işaretlemek için zaman damgaları olsun:

$yesterday= strtotime("yesterday");
$last_week = strtotime("last week");
$last_month = strtotime("last month");

Ama istenen sonuçları elde etmek için bir mysql sorguda bu damgaları kullanmak için nasıl emin değil Im.

3 Cevap

Böyle bir şey deneyin

SELECT id,
SUM(CASE WHEN votedate >= $yesterday THEN 1 ELSE 0 END) AS daycount,
SUM(CASE WHEN votedate >= $last_week THEN 1 ELSE 0 END) AS weekcount,
SUM(1) AS monthcount
FROM votes
WHERE yes_no = 'YES'
AND votedate >= $last_month
GROUP BY id

Sonra bir alt sorgu ve sayımları için maksimum değerleri alabilirsiniz emin olun.

(Denenmemiş bir sorgu doğasında olağan sözdizimi ıslaklık için izin lütfen.)


Yorumlarına yanıt olarak:

Maksimum değerleri elde etmek için verimli bir alt sorgu (yani korelasyon) olarak kullanmak için:

SELECT
MAX(daycount) AS MaxDayCount,
MAX(weekcount) AS MaxWeekCount,
MAX(monthcount) AS MaxMonthCount
FROM
(
.... all that stuff ...
) AS qcounts

Onlar farklı olduğu için ama tabii ki, kimlikleri onları nitelik olamaz. Onlara kimlikleri ile bir anda isterseniz, olabilir

SELECT id, monthcount
FROM
(
.... all that stuff ...
) AS qcounts
ORDER BY monthcount DESC
LIMIT 1

ve bir kez gün / hafta / ay için, bunu üç kez yapın.

Not: Bu bir tek oldukça verimli bir sorguda başarmak olabilir bazı şeyleri göstermek için hepsi bu. Eğer (iyi == ve basit) basit olduğunu bulmak diğerlerinin önerdiği gibi, onu kırmak olsaydı ben şaşırmam.

Genel olarak:

select story_id, sum(vote_code)
from story_vote
group by story_id;

Özellikle oy tarih aralıkları için:

select story_id, sum(vote_code)
from story_vote
where vote_date >= 'least date, inclusive' 
and vote_date < 'last date, exclusive'
group by story_id;

OP yorumlar:

Nasıl ORDER BY yan tümcesini kullanmak istiyorsunuz?

Bir order by sum(vote_code) eklemek istiyorum. Önce en çok oy alan hikayeler istiyorsanız Azalan:

order by sum(vote_code) desc;

Düzenlemek On: Ben o bütün hikayeler, değil tek istediği, bu yüzden sahip maddesini kaldırarak ediyorum fark.

SELECT a.*, SUM(vote_code) AS votes
FROM articles a JOIN votes v ON (a.story_id = v.vote_storyid)
WHERE v.vote_date >= $yesterday
GROUP BY a.story_id
ORDER BY 2 DESC;

Aynı şekilde $last_week ve $last_month için.

Eğer sonuçları sıralanabilir istiyorsanız, bunun yerine tek bir sorguda bunu yapmaya çalışıyor, ayrı sorgularda bunu yapmak daha iyidir. Sıralama düzeni üç dönemin her biri için çok farklı olabilir çünkü.