MySQL -

6 Cevap php
$activeQuery = mysql_query("SELECT count(`status`) AS `active` FROM `assignments` WHERE `user` = $user_id AND `status` = 0");
$active = mysql_fetch_assoc($activeQuery);

$failedQuery = mysql_query("SELECT count(`status`) AS `failed` FROM `assignments` WHERE `user` = $user_id AND `status` = 1");
$failed = mysql_fetch_assoc($failedQuery);

$completedQuery = mysql_query("SELECT count(`status`) AS `completed` FROM `assignments` WHERE `user` = $user_id AND `status` = 2");
$completed = mysql_fetch_assoc($completedQuery);

Orada bunu yapmak için daha iyi bir yolu olmalı, değil mi? Sana yapmaya çalışıyorum gördüğünüz gibi ben durmaya gerek ne kadar bilmiyorum, ama bir sorguda bütün bunları yapmak için herhangi bir yolu var mı? Ben çıktı aktif etmek gerekiyor, başarısız, ve tercihen bir sorguda, atamaları tamamladı.

6 Cevap

Bu sorgu gibi bir şey deneyebilirsiniz

SELECT Status , COUNT(*) StatusCount 
FROM assignments
WHERE Status IN (0, 1, 2)
AND User = $user_id 
GROUP BY Status

Bu deneyin

$activeQuery = SELECT status, count(status) as "status count" FROM `assignments` WHERE `user` = $user_id GROUP BY `status`

edit: eklendi grup tarafından

Bunun yerine tek tek bunları yaparken size aşağıdaki tek bir SQL deyimi kullanabilirsiniz

SELECT count(*), `status` 
FROM `assignments` 
WHERE `user` = $user_id
  AND `status` in (0,1,2)
GROUP BY `status`
ORDER BY `status`

Sonuç etrafında döngü sonuçları elde etmek için ayarlanır.

SELECT  
(SELECT COUNT(*) FROM `assignments` WHERE `user` = $user_id AND `status` = 0) AS active,
(SELECT COUNT(*) FROM `assignments` WHERE `user` = $user_id AND `status` = 1) AS failed,
(SELECT COUNT(*) FROM `assignments` WHERE `user` = $user_id AND `status` = 2) AS completed,
FROM `assignments`
GROUP BY active, failed, completed

Biçimlendirme kontrol, ama bu yeterince yakın veya yakın değil.

Bir sorguda almak için GROUP BY kullanın, fakat ayrı satırlarda.

$query = mysql_query("SELECT `status`, count(*) AS `num` FROM `assignments` WHERE `user` = $user_id AND `status` in (0,1,2) GROUP BY `status` ORDER BY `status` ASC");
$active_count = 0;
$failed_count = 0;
$completed_count = 0;
while ($array = mysql_fetch_assoc($query))
{
    if ($array['status'] == 0)
        $active_count = $array['num'];
    else if ($array['status'] == 1)
        $failed_count = $array['num'];
    else if ($array['status'] == 2)
        $completed_count = $array['num'];
}

Ben seçeneği var, ben sql enjeksiyon karşı koruma ve verimliliği için korunmasına yardım etmek için hazır deyim (ler) kullanma alışkanlığı değilim (requires using mysqli).

Ama bu daha sonra, bir seçenek değilse,

SELECT
  CASE `status`
      WHEN 0 THEN `active`
      WHEN 1 THEN `failed`
      WHEN 2 THEN `completed`
      ELSE `unknown`
    END
    AS `statuslabel`,
  COUNT(status)
    AS `statuscount`
FROM `assignments` 
WHERE `user` = $escaped_user_id
GROUP BY `statuslabel`
ORDER BY `statuslabel`

Önceden oluşturulmuş olacaktır $escaped_user_id, kullanımına dikkat:

$escaped_user_id = mysql_real_escape_string($user_id);