Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Uso de count en consulta con DISTINCT y UNION

Estas en el tema de Uso de count en consulta con DISTINCT y UNION en el foro de Mysql en Foros del Web. Hola, querría obtener el número total de registros de esta consulta además de los 5 que cojo: SELECT DISTINCT u.nombre,u.apellidos,u.id_usuario,u.ultima_modific acion FROM usuarios u INNER ...
  #1 (permalink)  
Antiguo 11/11/2011, 10:01
 
Fecha de Ingreso: septiembre-2009
Mensajes: 215
Antigüedad: 12 años, 2 meses
Puntos: 1
Uso de count en consulta con DISTINCT y UNION

Hola, querría obtener el número total de registros de esta consulta además de los 5 que cojo:

SELECT DISTINCT u.nombre,u.apellidos,u.id_usuario,u.ultima_modific acion
FROM usuarios u
INNER JOIN amigos a on u.id_usuario = a.id_usuario1
WHERE a.id_usuario2 = ".$idUsuario."

UNION

SELECT DISTINCT u.nombre,u.apellidos,u.id_usuario,u.ultima_modific acion
FROM usuarios u
INNER JOIN amigos a on u.id_usuario = a.id_usuario2
WHERE a.id_usuario1 = ".$idUsuario."

ORDER BY ultima_modificacion DESC
LIMIT 5

Sé que es con el count pero no soy capaz de que funcione. Gracias de antemano
  #2 (permalink)  
Antiguo 11/11/2011, 11:27
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 14 años, 11 meses
Puntos: 447
Respuesta: Uso de count en consulta con DISTINCT y UNION

Hola Pinchu...

No me quedó claro qué es lo que quieres hacer, sin embargo tengo que mencionarte algunos detalles de tu consulta. Al poner las últimas dos cláusulas

Código:
ORDER BY ultima_modificacion DESC
LIMIT 5
Estas afectan EL RESULTADO DE LA UNIÓN, no sólo la segunda consulta, checa este script:

Código MySQL:
Ver original
  1. mysql> CREATE TABLE TablaA (id INT, descripcion VARCHAR(10));
  2. Query OK, 0 rows affected (0.14 sec)
  3.  
  4. mysql> INSERT INTO TablaA VALUES (1, 'uno'), (2, 'dos'), (3, 'tres');
  5. Query OK, 3 rows affected (0.06 sec)
  6. Records: 3  Duplicates: 0  Warnings: 0
  7.  
  8. mysql> SELECT * FROM TablaA;
  9. +------+-------------+
  10. | id   | descripcion |
  11. +------+-------------+
  12. |    1 | uno         |
  13. |    2 | dos         |
  14. |    3 | tres        |
  15. +------+-------------+
  16. 3 rows in set (0.00 sec)
  17.  
  18. mysql> CREATE TABLE TablaB (id INT, descripcion VARCHAR(10));
  19. Query OK, 0 rows affected (0.08 sec)
  20.  
  21. mysql> INSERT INTO TablaB VALUES (4, 'cuatro'), (5, 'cinco'), (3, 'seis');
  22. Query OK, 3 rows affected (0.06 sec)
  23. Records: 3  Duplicates: 0  Warnings: 0
  24.  
  25. mysql> SELECT * FROM TablaB;
  26. +------+-------------+
  27. | id   | descripcion |
  28. +------+-------------+
  29. |    4 | cuatro      |
  30. |    5 | cinco       |
  31. |    3 | seis        |
  32. +------+-------------+
  33. 3 rows in set (0.00 sec)

Ahora bien, supongamos que ejecutas dos sentencias por separado:

Código MySQL:
Ver original
  1. mysql> SELECT id, descripcion FROM TablaA;
  2. +------+-------------+
  3. | id   | descripcion |
  4. +------+-------------+
  5. |    1 | uno         |
  6. |    2 | dos         |
  7. |    3 | tres        |
  8. +------+-------------+
  9. 3 rows in set (0.00 sec)
  10.  
  11. mysql> SELECT id, descripcion FROM TablaB LIMIT 2;
  12. +------+-------------+
  13. | id   | descripcion |
  14. +------+-------------+
  15. |    4 | cuatro      |
  16. |    5 | cinco       |
  17. +------+-------------+
  18. 2 rows in set (0.02 sec)

Observa que la primer consulta regresa 3 registros, mientras que la segunda regresa 2... si hacemos la unión de las dos consultas:

Código MySQL:
Ver original
  1. mysql> SELECT id, descripcion FROM TablaA
  2.     -> UNION
  3.     -> SELECT id, descripcion FROM TablaB LIMIT 2;
  4. +------+-------------+
  5. | id   | descripcion |
  6. +------+-------------+
  7. |    1 | uno         |
  8. |    2 | dos         |
  9. +------+-------------+
  10. 2 rows in set (0.02 sec)

El resultado NO SON 5 REGISTROS sólo dos (los marcados por la cláusula LIMIT)... en tu caso por lo tanto el resultado de la consulta siempre serían 5 registros. Para obtener los registros "completos" deberías hacer algo como esto:

Código MySQL:
Ver original
  1. mysql> SELECT id, descripcion FROM TablaA
  2.     -> UNION
  3.     -> (SELECT id, descripcion FROM TablaB LIMIT 2);
  4. +------+-------------+
  5. | id   | descripcion |
  6. +------+-------------+
  7. |    1 | uno         |
  8. |    2 | dos         |
  9. |    3 | tres        |
  10. |    4 | cuatro      |
  11. |    5 | cinco       |
  12. +------+-------------+
  13. 5 rows in set (0.00 sec)

Es decir, asociar la cláusula LIMIT SOLO A LA SEGUNDA CONSULTA. Lo mismo sucede con las funciones ORDER BY, GROUP BY, HAVING...

finalmente, si quieres saber el número total de registros de la unión, podrías hacer lo siguiente:

Código MySQL:
Ver original
  1. mysql> SELECT COUNT(*) FROM
  2.     -> (
  3.     -> SELECT id, descripcion FROM TablaA
  4.     -> UNION
  5.     -> (SELECT id, descripcion FROM TablaB LIMIT 2)) T;
  6. +----------+
  7. | COUNT(*) |
  8. +----------+
  9. |        5 |
  10. +----------+
  11. 1 row in set (0.00 sec)

Saludos y espero que te sirva de ayuda.
Leo

Etiquetas: count, distinct, join, registros, select, union
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:41.