Можно ли считать два столбца в одном запросе

Скажем, у меня есть следующая структура таблицы:

t1
-------------
id // row id
userID_follower // this user is a follows another member
userID_following  // other member that this user 

Можно ли запустить один запрос для объединения двух следующих:

  • сколько пользователей этого человека следует

    выберите COUNT (id) из t1 WHERE userID_follower = ". $myID.". "

  • сколько пользователей следует за этим человеком

    выберите COUNT (id) из t1 WHERE userID_following = ". $myID."

Спасибо.

Ответ 1

В MySql вы можете использовать функцию SUM() по условию, так как ложное условие будет равно 0, а истинное значение будет равно 1:

SELECT SUM(userID_follower = $myID) AS followerCount,
   SUM(userID_following = $myID) AS followingCount
FROM t1
WHERE userID_follower = $myID
   OR userID_following = $myID

Ответ 2

Чем больше решение Hoyle (ISO) будет использовать выражение Case:

Select Sum( Case When userID_follower = $myID Then 1 Else 0 End ) As followerCount
    , Sum( Case When userID_following = $myID Then 1 Else 0 End ) As followingCount
From t1
Where userID_follower = $myID
    Or userID_following = $myID

Ответ 3

Я рекомендую возвращать две строки с одним счетчиком для каждой строки вместо двух столбцов:

SELECT 'follower', COUNT(*) AS count FROM t1 WHERE userID_follower = ?
UNION ALL
SELECT 'following', COUNT(*) FROM t1 WHERE userID_following = ? 

Это может показаться дегенеративным решением, но причина в том, что если userID_follower и userID_following индексируются, это может использовать индексы. Если вы попытаетесь получить результаты в двух столбцах, как показано в других ответах, они не могут использовать индексы и должны выполнять сканирование таблицы.

Другие советы, которые касаются вопроса:

  • В этом случае нет преимущества использования COUNT (id).
  • Вы должны использовать параметры SQL-запроса вместо интерполяции $myID в свой запрос.

Ответ 4

Я думаю, что что-то вроде этого должно работать:

select ownerID, count( distinct userID_follow), count(distinct userID_following) from t1 group by ownerID