2013-09-12 2 views
1

Это мой стол, я должен принести MAX (id) каждого status_id.PHP SQL имеет вопрос

id  status_id 
10   1 
11   1 
12   2 
13   2 
14   2 
15   4 
16   4 

Итак, я использую этот SQL-запрос, он работает верно и fetchs мне все макс ID.

select status_id, max(id) as max FROM `table` 
where status_id in (1,2,3,4) group by status_id 

Эта команда sql извлекает мне 3 MAX id, используя while.

11, 14, 16 ....

Вы видите, есть не любой подходящий идентификатор для 3 status_id. И если нет подходящего id для 3-го status_id, просто отметьте его как ноль. Поэтому я хочу, что SQL принесет следующие результаты:

11, 14, 0, 16

+1

Я не вижу status_id 3 в вашем столе. поэтому не ожидайте получить 0 –

+0

Да, вы не видите. И я хочу, чтобы, если в моем столе нет идентификатора статуса 3, sql приносит нуль – RiKo

+0

, то как насчет использования 'IFNULL' ...? –

ответ

4

Вы можете создать подзапрос, который в основном имеет все ID «s вам нужно, и есть левый присоединиться к нему.

SELECT a.status_ID, 
     IFNULL(MAX(b.id), 0) maxVal 
FROM  
     (
      SELECT 1 status_ID UNION ALL 
      SELECT 2 UNION ALL 
      SELECT 3 UNION ALL 
      SELECT 4 
     ) a 
     LEFT JOIN `table` b ON a.status_id = b.status_id 
GROUP BY a.status_id 
+0

Да, человек! Спасибо! Прекрасно работает! – RiKo

0

Вы можете присоединиться к временной фиктивной таблицы, содержащей все идентификаторы и stats_id значение 0:

SELECT dummy.status_id, COALESCE(MAX(id), 0) AS max 
FROM (
     SELECT 1 status_id 
    UNION SELECT 2 status_id 
    UNION SELECT 3 status_id 
    UNION SELECT 4 status_id 
) dummy 
LEFT JOIN `table` 
ON dummy.status_id = table.status_id 
GROUP BY dummy.status_id 

Но это не масштабируется и является техническое обслуживание кошмар (вам нужно изменить выбор манекена в случае появления нового status_id). Если у вас есть таблица, содержащая ALL status_ids, замените фиктивный-select на эту таблицу.

+0

Да, отлично работает. Спасибо! – RiKo

Смежные вопросы