тот же самый счетчик таблиц - PullRequest
0 голосов
/ 25 ноября 2011
SELECT COUNT(*) as totalHappenings FROM `happenings` WHERE `userId` = ? 
UNION 
SELECT COUNT(*) as xHappenings FROM `happenings` WHERE `userId` = ? AND `destinationObjectType` = \'2\' 
UNION 
SELECT COUNT(*) as yHappenings FROM `happenings` WHERE `userId` = ? AND `destinationObjectType` = \'1\'

Поскольку это одна и та же таблица, и я не хочу проходить через 3 раза параметр userId, как я могу решить это наилучшим образом?

Ответы [ 3 ]

1 голос
/ 25 ноября 2011
SELECT 
    COUNT(*) AS totalHappenings,
    SUM(CASE WHEN `destinationObjectType` = \'2\' THEN 1 ELSE 0 END) AS xHappenings, 
    SUM(CASE WHEN `destinationObjectType` = \'1\' THEN 1 ELSE 0 END) AS yHappenings 
FROM `happendings` 
WHERE `userId` = ?

Результат:

totalHappenings xHappenings yHappenings
      24            10          14
1 голос
/ 25 ноября 2011

Вы можете сделать это с помощью операторов if внутри предложения select:

  SELECT
    COUNT(userId) as totalHappenings, 
    SUM(IF(`destinationObjectType`='2',1,0) as xHappenings,
    SUM(IF(`destinationObjectType`='1',1,0) as yHappenings
  FROM `happenings`
  WHERE `userId` = ?

Это обязательно вернет ваши результаты в 3 столбцах.Ваш исходный запрос возвращался в 3 строки, но я думаю, что это не проблема.

0 голосов
/ 25 ноября 2011

попробуйте кратчайший путь:

SELECT COUNT(*) as totalHappenings, SUM(`destinationObjectType` = \'2\') AS xHappenings, SUM(`destinationObjectType` = \'1\') AS yHappenings FROM `happenings` WHERE `userId` = ? 

сравнение внутри SUM возвращает true или false (1 или 0), поэтому нет необходимости в IF или CASE выражениях

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...