2014-11-18 3 views
0

У меня есть таблица в SQL, которая представляет собой список пользователей, которые регистрируются на веб-сайте. Это выглядит так же, как это:SELECT с COUNT другого SELECT

id | date | status 
------------------ 

Статус может быть 0 для не проверки в, 1 для проверяется, 2 для покрыты, и 3 для отсутствуют.

Я пытаюсь построить один запрос, в котором перечислены все строки с status = 0, но также имеет значение COUNT для количества строк status = 3 на каждом конкретном id.

Возможно ли это?

+1

'LEFT JOIN' в той же таблице снова, на id = id (при условии, что это идентификатор пользователя, а не первичный или уникальный ключ), status = 3 и' COUNT' - вторая таблица. – Wrikken

+0

есть небольшой образец данных и результат, который вы хотели бы видеть? – bowlturner

ответ

7

версию MySQL

просто присоединиться к графе, что присоединенная по идентификатору.

SELECT t.*, COALESCE(t1.status_3_count, 0) as status_3_count 
FROM yourtable t 
LEFT JOIN 
( SELECT id, SUM(status=3) as status_3_count 
    FROM yourtable 
    GROUP BY id 
) t1 ON t1.id = t.id 
WHERE t.status = 0 

примечание: это делает булеву сумму (так называемый счет) .. выражение возвращает истину или ложь, 1 или 0. поэтому я просуммировать эти вверх, чтобы вернуть счетчик статуса = 3 для каждого идентификатор

SQL SERVER VERSION

SELECT id, SUM(CASE WHEN status = 3 THEN 1 ELSE 0 END) as status_3_count 
FROM yourtable 
GROUP BY id 

или просто использовать WHERE status = 3 и COUNT(id)

+0

В SQL-сервере SUM (statuz = 3) дает ошибку около =. Могу ли вы рассказать мне, что такое версия сервера SQL для этого? Благодарю. –

+0

@ Борат Сагдиев видит мое редактирование, я считаю, что одна из этих двух попыток решит его –

0

Попробуйте зависимую подзапрос:

SELECT t1.*, 
     ( SELECT count(*) 
      FROM sometable t2 
      WHERE t2.id = t1.id 
      AND t2.status = 3 
     ) As somecolumnname 
FROM sometable t1 
WHERE t1.status=0 
+1

зависимые подзапросы намного медленнее, чем просто регулярное объединение .. для каждой строки в таблице вы выполняете сравнения строк^n ... так, как 1000 строк возвращает 1 миллион сравнений. –

+0

@JohnRuddell Да, вы правы, зависимые подзапросы на MySql медленны. – krokodilko

0

Вы можете использовать присоединиться к-й является. Написать один запрос, который получит все строки со статусом нулевой:

SELECT * 
FROM myTable 
WHERE status = 0; 

Затем написать подзапрос, чтобы получить отсчеты для статуса 3 для каждого идентификатора, с помощью группировки по идентификатору:

SELECT COUNT(*) 
FROM myTable 
WHERE status = 3 
GROUP BY id; 

С вы хотите, чтобы все строки из первой таблицы (по крайней мере, это то, что я воображая), вы можете использовать LEFT JOIN со вторым столом, как это:

SELECT m.id, m.status, IFNULL(t.numStatus3, 0) 
FROM myTable m 
LEFT JOIN (SELECT id, COUNT(*) AS numStatus3 
     FROM myTable 
     WHERE status = 3 
     GROUP BY id) t ON m.id = t.id 
WHERE m.status = 0; 

выше будет показывать только счетчик для строк, содержащих id tha t имеет статус 0. Надеюсь, это то, что вы ищете. Если это не так, пожалуйста, разместите некоторые примеры данных и ожидаемые результаты, и я помогу вам в этом. Вот пример SQL Fiddle.

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