Bir sorguda iki alanlarını sayma sorun

4 Cevap php

i bir tablodan yeni özel mesajları ve eskisini saymak gerekir adamlar

Akla gelen ilk şey, bu yüzden yapmak mysql_num_rows ve kolay bir şey kullanıyor

  // check new pms
  $user_id  = $userinfo['user_id'];
  $sql = "SELECT author_id  FROM bb3privmsgs_to WHERE user_id='$user_id' AND (pm_new='1' OR  pm_unread='1')";
  $result = $db->sql_query($sql) ;
  $new_pms = $db->sql_numrows($result);
  $db->sql_freeresult($result);

  // check old pms
  $sql = "SELECT author_id  FROM bb3privmsgs_to WHERE user_id='$user_id' AND (pm_new='0' OR  pm_unread='0')";
  $result = $db->sql_query($sql) ;
  $old_pms = $db->sql_numrows($result);
  $db->sql_freeresult($result);

ama nasıl ben sadece tek bir tablosu ve kısa hatlarda bu iki alanı güvenebilirsiniz? ~

4 Cevap

Yerine bu sorguyu kullanın:

SELECT SUM(CASE WHEN pm_new = '1' OR pm_unread = '1' THEN 1 ELSE 0 END) AS new_pms,
       SUM(CASE WHEN pm_new = '0' OR pm_unread = '0' THEN 1 ELSE 0 END) AS old_pms
  FROM bb3privmsgs_to
 WHERE user_id='$user_id'

Burada daha temiz okur MySQL özgü versiyonu:

SELECT COUNT(IF(pm_new = '1' OR pm_unread = '1', 1, NULL)) AS new_pms,
       COUNT(IF(pm_new = '0' OR pm_unread = '0', 1, NULL)) AS old_pms
  FROM bb3privmsgs_to
 WHERE user_id='$user_id'

MySQL 1 veya 0'a karşılaştırmalar döküm olacaktır. Siz SUM() için sonuçlar saymak için çalışıyorlardı WHERE fıkra bölümünü eklemek için kullanabilirsiniz.

Bu CASE WHEN örneklere bir (MySQL belirli) daha kısa bir alternatiftir.

SELECT 
  SUM(pm_new='1' OR pm_unread='1') as new_pms, 
  SUM(pm_new='0' OR pm_unread='0') as old_pms
FROM bb3privmsgs_to
WHERE user_id='$userid'

SQL Server, böyle bir şey yapabilirsiniz:

SELECT 
   SUM(CASE WHEN pm_new='1' OR  pm_unread='1' THEN 1 ELSE 0 END),
   SUM(CASE WHEN pm_new='0' OR  pm_unread='0' THEN 1 ELSE 0 END) 
FROM 
   bb3privmsgs_to WHERE user_id='$user_id'

Bana ayrıntıları size geri dönelim, size mySql de aynı şeyi yapabiliriz herhalde olacak ...

Diğer önerilerden bazıları tembel bir alternatif olarak:

SELECT SUM(newPMS) AS newPMS,
       SUM(oldPMS) AS oldPMS
  FROM ( SELECT COUNT(author_id) AS newPMS,
                0 AS oldPMS
           FROM bb3privmsgs_to
          WHERE user_id='$user_id'
            AND (pm_new='1' OR pm_unread='1')
         UNION
         SELECT 0 AS newPMS
                COUNT(author_id) AS oldPMS
           FROM bb3privmsgs_to
          WHERE user_id='$user_id'
            AND (pm_new='0' OR pm_unread='0')
       )