2010-05-28 2 views
4

ребята мне нужно рассчитывать новые личные сообщения и старый из таблицыпроблема в подсчете два поля в одном запросе

так первое, что придет на ум, используя mysql_num_rows и легкая вещь, чтобы сделать

// 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); 

но как я могу рассчитывать эти два поля только в одном операторе и короткие строки ~

ответ

5

Используйте этот запрос вместо:

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' 

Вот MySQL-конкретный вариант, который читает более аккуратно:

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' 
+1

+1 - Faster пальцев :) – gnarf

1

В SQL Server, вы можете сделать что-то вроде этого:

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' 

Я полагаю, вы можете делать то же самое в mySql, позвольте мне вернуться к вам подробнее ...

2

MySQL будет сравнивать сравнение с 1 или 0. Вы можете использовать SUM(), чтобы добавить часть предложения WHERE, на которое вы пытались подсчитать результаты.

Это (для MySQL) более короткая альтернатива примерам CASE WHEN.

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' 
1

Как ленивой альтернатива некоторых других предложений:

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') 
     ) 
Смежные вопросы