2015-03-22 2 views
1

У меня есть два запроса:Объединение двух SQL-запросов эффективно

1)

SELECT COUNT(*) AS total, COUNT(supporter) AS done FROM Supports; 

2)

SELECT supporter, COUNT(supporter) AS amount FROM Supports 
GROUP BY supporter ORDER BY amount DESC LIMIT 1; 

Как эффективно совмещать их?

Это как таблица выглядит следующим образом:

+-----------------------------+ 
| id | name | supporter | 
+-----------------------------+ 
| 1 | user1 | sup1 | 
| 2 | user1 | sup2 | 
| 3 | user1 | NULL | 
| 4 | user2 | sup1 | 
| 5 | user2 | sup3 | 
+-----------------------------+ 
+0

Что следует вывод выглядеть? 1 строка с 3 столбцами? 3 строки с 1 столбиком? Что-то другое? –

+0

1 ряд с 4 колонками (всего, сделано, сторонником, сумма) – Bob

ответ

1

Так как вы хотите, в общей сложности, вам придется использовать подзапрос, чтобы объединить в одном запросе. Включите его в предложение FROM.

SELECT supporter, COUNT(supporter) AS amount, total, done 
FROM Supports, 
    (SELECT COUNT(*) AS total, COUNT(supporter) AS done FROM Supports) totals 
GROUP BY supporter 
ORDER BY amount DESC 
LIMIT 1; 
+0

Спасибо! Мне понравилось, как вы просто сделали один подзапрос, а не два :) В вашем ответе также есть «DESC LIMIT 1», который, вероятно, забыл другой ответ. – Bob

1

Я считаю, что это то, что вы ищете:

SELECT 
    (SELECT COUNT(*) FROM Supports) as total, 
    (SELECT COUNT(supporter) FROM Supports) as done, 
    supporter, 
    COUNT(*) AS amount 
FROM Supports 
GROUP BY supporter 
ORDER BY amount; 

Результаты выглядит следующим образом: http://sqlfiddle.com/#!9/9e4ee/9

total done supporter amount 
5  4  sup3  1 
5  4  sup2  1 
5  4  NULL  1 
5  4  sup1  2 
+0

Я буду использовать ваш запрос, но с «DESC LIMIT 1» в конце. К сожалению, я не могу отметить его как правильный ответ, потому что он этого не замечает. Но я поддержал, потому что мне понравился ваш подход к ответу и пример sqlfiddle :) – Bob

+0

Не беспокойтесь @Bob. Рад, что это помогло в некоторой степени. – zedfoxus

0
SELECT a.total, a.done, b.supporter, b.amount 
     (SELECT COUNT(*) AS total, 
       COUNT(supporter) AS done 
      FROM Supports 
    ) AS a 
    JOIN 
     (SELECT supporter, 
       COUNT(supporter) AS amount 
      FROM Supports 
      GROUP BY supporter 
      ORDER BY amount DESC 
      LIMIT 1 
    ) AS b; 
Смежные вопросы