TransWikia.com

Como obtener el total de filas de diferentes registros

Stack Overflow en español Asked by parada399 on January 1, 2022

Necesito un ayuda ya que busco y busco y no encuentro.
Resulta que necesito el total de filas o registros que tengan cada id, por separado.

Tengo una tabla de calificaciones: id,id_usuario,positivo,negativo.
En esa tabla se guardan las id de usuarios que han calificado al usuario principal.

id_usuario | positivo | negativo

2          |    0     |    3

2          |    0     |    5 

1          |    6     |    0

1          |    0     |    2

En esa tabla hay 2 votos negativos para el usuario con id 2 y 1 voto positivo y un voto negativo para el usuario con id 1.
Lo que ya consigo es contar la cantidad de usuarios que tienen votos positivos o negativos.

SELECT DISTINCT id_usuario FROM calificaciones WHERE ".$tipoVoto." <> '0'

Ese sql lo meto en un WHILE para comenzar a procesar cada id por separado para mostrar el número de estrellas que posee cada usuario. Pero es ahí donde necesito ordenar esos registros por el que tenga mayor numero de votos (todo esto lo muestro en la sección del administrador para tener un top de usuarios con mayor numero de estrellas positivas o negativas).

Cada fila es un voto, me resulta fácil con la id por separado contar el número de filas con:

SELECT COUNT(*) from calificaciones where id_usuario = '2' Esto dentro del WHILE.

Pero esto me arroja una lista de registros desordenados. Necesito ordenar los registros con mayor número de estrellas a menor.

nombre usuario | ✩✩✩✩✩ (5 votos positivos o negativos) |

numbre usuario | ✩✩✩ (3 votos)

numbre usuario | ✩✩ (2 votos)

Ese resultado busco. Así como lo tengo en el WHILE me tira la consulta tal cual sin nigun orden. Trate de user order by MAX() pero no es posible.

Adjunto el código:

<?php
require "../conexion.php";
//variable que define el tipo de estrellas a mostrar
$tipoEstrella = "negativo";//$_POST['tipoEstrella'];

//aplicamos el for a la tabla de usuario
$sqlEstrellas = mysqli_query($conexion,"SELECT DISTINCT id_usuario FROM calificaciones WHERE ".$tipoEstrella." <> '0'");
?>
<table>
<?php
while ($fila = mysqli_fetch_assoc($sqlEstrellas)) {

    //consultamos la base de datos por el nick
    $sqlUser = mysqli_query($conexion,"SELECT nick FROM usuario WHERE id = '".$fila['id_usuario']."'");
    $userTB = mysqli_fetch_assoc($sqlUser);

    //total de publicaciones del usuario
    $sqlpubl = mysqli_query($conexion,"SELECT total FROM total_publicaciones WHERE id_usuario = '".$fila['id_usuario']."'");
    $publicacionesT = mysqli_fetch_assoc($sqlpubl);

    //contamos el total de de registros de un usuario
    $sqlStars = mysqli_query($conexion,"SELECT COUNT(*) AS totalBD FROM calificaciones WHERE id_usuario = '".$fila['id_usuario']."' AND ".$tipoEstrella." <> '0'");
    $totalStars = mysqli_fetch_assoc($sqlStars);
    $totalRegistros = $totalStars['totalBD'];
    ?>
    <tr>
        <td><?php echo $userTB['nick'];?></td>
        <td>
                <?php echo $totalRegistros;?>
        </td>
        <td><?php echo $publicacionesT['total'];?></td>
    </tr>

    <?php
}
?>
</table>

One Answer

Las consultas en bucle suelen ser una mala idea y en la mayoría de los casos se pueden evitar.

Podrías obtener el resultado esperado en una única consulta:

Ejemplo:

Schema (MySQL v5.7)

CREATE TABLE  IF NOT EXISTS valuations (
    id int(10) unsigned NOT NULL AUTO_INCREMENT,
    user_id int NOT NULL,
    positive int,
    negative int,
    PRIMARY KEY (id)

) DEFAULT CHARSET=utf8;

INSERT INTO valuations
VALUES 
(1, 2, 0, 3),
(2, 2, 0, 5), 
(3, 1, 6, 0),
(4, 1, 0, 2);

Set de datos

SELECT * from valuations;

    | id  | user_id | positive | negative |
    | --- | ------- | -------- | -------- |
    | 1   | 2       | 0        | 3        |
    | 2   | 2       | 0        | 5        |
    | 3   | 1       | 6        | 0        |
    | 4   | 1       | 0        | 2        |

Obtener las valoraciones de usuarios ordenadas

SELECT 
    valuations.user_id, 
    COUNT(valuations.user_id) total, 
    SUM(valuations.positive) total_positive,  
    SUM(valuations.negative) total_negative, 
    (SUM(valuations.positive) - SUM(valuations.negative)) valuation
FROM valuations
GROUP BY valuations.user_id
ORDER BY valuation DESC;

    | user_id | total | total_positive | total_negative | valuation |
    | ------- | ----- | -------------- | -------------- | --------- |
    | 1       | 2     | 6              | 2              | 4         |
    | 2       | 2     | 0              | 8              | -8        |

En caso de necesitar datos del usuario como el nombre por ejemplo, puedes añadir un INNER JOIN

Answered by Xerif on January 1, 2022

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP