Нужно получить одну строку результата с подзапросом

99
14

у вас есть запрос sql:

SELECT 
(SELECT COUNT('id') FROM 'table_name' WHERE 'custom_id' IN (10,9,8,6,5,4,3,2,1) AND 'content' = "test 1") AS test_1 ,
(SELECT COUNT('id') FROM 'table_name' WHERE 'custom_id' IN (10,9,8,6,5,4,3,2,1) AND 'content' = "test 2") AS test_2 ,
(SELECT COUNT('id') FROM 'table_name' WHERE 'custom_id' IN (10,9,8,6,5,4,3,2,1) AND 'content' = "test 3") AS test_3
FROM 'table_name' GROUP BY 'content'

и получить результат следующим образом:

test_1, test_2, test_3
2, 7, 0
2, 7, 0
2, 7, 0
2, 7, 0
2, 7, 0
2, 7, 0
2, 7, 0
2, 7, 0
2, 7, 0
2, 7, 0

Необходимо получить результат только в одной строке, например:

test_1, test_2, test_3
2, 7, 0

Как? Что случилось с моим запросом?

спросил(а) 2017-01-04T10:27:00+03:00 4 года, 4 месяца назад
1
Решение
76

Ваш запрос должен быть переписан следующим образом:


SELECT 
SUM(CASE WHEN 'content' = "test 1" THEN 1 ELSE 0 END) AS test_1,
SUM(CASE WHEN 'content' = "test 2" THEN 1 ELSE 0 END) AS test_2,
SUM(CASE WHEN 'content' = "test 3" THEN 1 ELSE 0 END) AS test_3
FROM
'table_name'
WHERE
'custom_id' IN (10,9,8,6,5,4,3,2,1);

ответил(а) 2017-01-04T11:02:00+03:00 4 года, 4 месяца назад
63

Проверь это.

SELECT  distinct 
(SELECT COUNT('id') FROM 'table_name' WHERE 'custom_id' IN (10,9,8,6,5,4,3,2,1) AND 'content' = "test 1") AS test_1 ,
(SELECT COUNT('id') FROM 'table_name' WHERE 'custom_id' IN (10,9,8,6,5,4,3,2,1) AND 'content' = "test 2") AS test_2 ,
(SELECT COUNT('id') FROM 'table_name' WHERE 'custom_id' IN (10,9,8,6,5,4,3,2,1) AND 'content' = "test 3") AS test_3
FROM 'table_name' GROUP BY 'content'

ответил(а) 2017-01-04T10:30:00+03:00 4 года, 4 месяца назад
-4

То, что вы делаете, не имеет большого смысла. Вы выбираете из таблицы и группы по содержанию. Это означает, что вы получаете одну строку результатов для каждого контента (один для "теста 1", один для "теста 2" и т.д.). Кажется, что в вашей таблице есть десять разных контентов, так как вы показываете, что получаете десять строк результата.

Затем для каждой такой строки, независимо от того, что она содержит, вы выполняете три своих подзапроса, которые всегда получают одинаковые результаты.

Итак, либо:

select 
(select count(*) from table_name
where custom_id in (10,9,8,6,5,4,3,2,1) and content = 'test 1') as test_1 ,
(select count(*) from table_name
where custom_id in (10,9,8,6,5,4,3,2,1) and content = 'test 2') as test_2 ,
(select count(*) from table_name
where custom_id in (10,9,8,6,5,4,3,2,1) and content = 'test 3') as test_3 ;

или лучше:

select 
sum(content = 'test 1') as test_1,
sum(content = 'test 2') as test_2,
sum(content = 'test 3') as test_3
from table_name
where custom_id in (10,9,8,6,5,4,3,2,1);

ответил(а) 2017-01-04T11:07:00+03:00 4 года, 4 месяца назад
-4

Просто добавьте предложение TOP в инструкцию SELECT...

SELECT TOP 1
(SELECT COUNT('id') FROM 'table_name' WHERE 'custom_id' IN (10,9,8,6,5,4,3,2,1) AND 'content' = "test 1") AS test_1 ,
(SELECT COUNT('id') FROM 'table_name' WHERE 'custom_id' IN (10,9,8,6,5,4,3,2,1) AND 'content' = "test 2") AS test_2 ,
(SELECT COUNT('id') FROM 'table_name' WHERE 'custom_id' IN (10,9,8,6,5,4,3,2,1) AND 'content' = "test 3") AS test_3
FROM 'table_name' GROUP BY 'content'

ответил(а) 2017-01-04T10:33:00+03:00 4 года, 4 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема