2011-02-27 20 views
11

Digamos que tienen la siguiente estructura de la tabla:¿Es posible contar con dos columnas en la misma consulta

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

¿Es posible ejecutar una consulta única de combinar las dos características siguientes:

  1. cuántos usuarios esta persona está siguiendo

    select count (id) de t1 DONDE userID_follower = "$ MyID". . "

  2. cuántos usuarios siguen esta persona

    select count (id) de t1 DONDE userID_following =". $ MyID."

Gracias.

Respuesta

44

En MySQL, puede usar la función SUM() más de una condición, ya que una condición falsa será igual a 0, y una verdadera será igual a 1:

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

Oh, Dios mío. Esto proporciona mucha ventaja sobre los subconjuntos de conteo sin filtrar toda la selección sobre la cláusula 'where'. ¡Muchas gracias! – C4u

+0

¿por qué necesita la cláusula where? –

+0

@IstiaqueAhmed Las columnas deben estar indexadas. no es necesario hacer un escaneo completo de la tabla. –

1

Creo que algo así debería funcionar:

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

Oh, tienes razón, pero ¿cómo puedo obtener el valor de cuenta? ¿debo yo como AS cont1 y AS cnt2? – santa

+0

Sí, 'count (distinct userID_follow) as cnt1' debería funcionar. – SiggyF

2

Recomiendo volver dos filas con un cargo en cada fila, en lugar de dos columnas:

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

Esto puede parecer una solución degenerada, pero la razón es que si userID_follower y userID_following son índice ed, esto puede utilizar los índices. Si intenta obtener los resultados en dos columnas como se muestra en las otras respuestas, no puede usar los índices y tiene que hacer una exploración de tabla.

Otros consejos que son tangenciales a la pregunta: ¿

  • No hay ninguna ventaja en usar COUNT (id) en este caso.
  • Debe usar parámetros de consulta SQL en lugar de interpolar $ myID en su consulta.
+0

'no se pueden usar los índices y tiene que hacer una exploración de tabla', eso es incorrecto. Ver http://dev.mysql.com/doc/refman/5.0/en/index-merge-optimization.html –

+0

@Scrum: Aha, tienes razón, si pruebo con unos pocos miles de filas con más datos aleatorios, MySQL decide usar índices y realizar una fusión de unión. Probé con muy pocas filas o con una distribución aleatoria insuficiente. –

8

Cuanto más Hoyle solución (ISO) sería usar una expresión de caso:

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 
+0

No necesité el CASE porque mi columna era una int. ¡Gracias! – Dan

Cuestiones relacionadas