2016-03-26 2 views
0

В моем запросе выбираются все теги, соответствующие идентификатору пользователя, а затем для каждого тега, проверяется, имеет ли другой конкретный пользователь один и тот же тег (у пользователей есть несколько тегов). Вот то, что я в настоящее время:Получить SUM из нескольких результатов подзапроса

SELECT name as tname, 
(
SELECT COUNT(*) FROM tags WHERE tags.name = tname AND user_id = '101' 
) as count 
FROM tags 
WHERE user_id = '102' 

Выходной список тегов, с «количество», как 1, если есть совпадение, или 0, если нет совпадения. Это выглядит следующим образом:

+--------+-------+ 
| tname | count | 
+--------+-------+ 
| Apple |  1 | 
| Banana |  1 | 
| Orange |  1 | 
| Peach |  0 | 
| Pear |  1 | 
+--------+-------+ 

Вся информация есть, но я хочу, чтобы получить сумму всех матчей (в данном случае это будет 4). Я будет использовать все это внутри другого запроса, так что я могу иметь запрос следующим образом:

SELECT sum(count) as total_count, class FROM table where count > 3 GROUP BY class 

Любая помощь с благодарностью!

UPDATE:

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

SELECT SUM(count) as count 
FROM (
    SELECT name as tname, 
    (
    SELECT COUNT(*) FROM tags WHERE tags.name = tname AND user_id = '101' 
    ) as count 
    FROM tags 
    WHERE user_id = '102' 
    ) as t 

Это замечательно, но это только первая половина того, что я хотел достичь , У меня по-прежнему возникают проблемы с завершением этого запроса подсчета внутри другого запроса (чтобы в итоге получить список всех идентификаторов пользователей и соответствующий счетчик). Я закончил использование ответа Hang, потому что он включал минимальные изменения в мой текущий запрос, и я не мог найти способ получить тот же результат, используя ответ Гордона Линоффа (из-за моего непонимания). Мой желаемый результат будет выглядеть примерно так:

+--------+-------+ 
| id  | count | 
+--------+-------+ 
| 102 |  4 | 
| 103 |  3 | 
| 104 |  7 | 
| 105 |  2 | 
| 106 |  4 | 
+--------+-------+ 

Я хочу «SELECT ID FROM пользователей», и для каждого пользователя, получить счетчик с помощью обновленного подзапроса, заменив «102» с идентификатором для каждого пользователь. Если то, что я говорю, нуждается в разъяснении, пожалуйста, спросите! Еще раз спасибо за вашу помощь!

+0

Каковы ваши ожидаемые результаты ? Идентификатор пользователя 102 и счетчик 4? – sgeddes

ответ

0

Если я правильно понял, вы хотите, чтобы подсчет тегов, что у пользователя 101 имеет этот пользователь 102, также имеет. Вы можете сделать это с помощью join:

select count(*) 
from tags t101 join 
    tags t102 
    on t101.tag = t102.tag and 
     t101.user_id = 101 and 
     t102.user_id = 102; 

Это предполагает, что нет дубликатов в таблице. Если есть, используйте select count(distinct t101.tag).

Кстати, вы можете получить подходящие теги, используя небольшое изменение на одном запросе:

select t101.tag, count(t102.user_id) 
from tags t101 left join 
    tags t102 
    on t101.tag = t102.tag and 
     t102.user_id = 102 
where t101.user_id = 101 
group by t101.tag; 
+0

Второй запрос в вашем ответе дал тот же результат, с которого я начинал, но я не мог понять формат, достаточный для того, чтобы он работал для меня. – user3689720

0

Оберните SELECT, вне вашего запроса, как это:

SELECT SUM(count) 
FROM (
    SELECT name as tname, 
    (
    SELECT COUNT(*) FROM tags WHERE tags.name = tname AND user_id = '101' 
    ) as count 
    FROM tags 
    WHERE user_id = '102' 
    ) 
+0

с небольшим изменением вашего ответа, я получил SUM, который я искал, но я все еще не могу понять, как использовать это в рамках моего другого запроса. Я отредактировал мой вопрос для уточнения – user3689720

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