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>
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
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP