Ответственность за качество и атрибуты

Tengo Estas Dos Tablas

introducir la descripción de la imagen aquí

Quiero obtener la suma de estados de todos los usuarios, por ejemplo

user1: estado=1
user1: estado=0
user2: estado=1
user1: estado=0
user1: estado=1
user1: estado=1
user2: estado=0
user2: estado=1

quiero la suma, el resultado seria:

Параллельный пользователь 1: suma de estado 1 = 3, suma de estado 0 = 2,

] второй пользователь 2: suma de estado 1 = 2, suma de estado 0 = 2

estuve intetando:

objBD.query('SELECT * from USUARIO ', function(err, rows, fields) {
    //debo usa un for para la consulta de abajo
        objBD.query('SELECT SUM(estado) from USUARIO u INNER JOIN INTENTO i ON u.ID_U=i.ID_U where estado=? and u.ID_U=?',[1,rows[0].ID_U], function(err, rows, fields) {
            console.log(rows);          
        });
    }); 

Mi consulta solo esta pensado para el valor de estado=0, deberia hacer lo mismo para estado=1, no creo que sea la mejor manera, quiero que me ayuden crear una consulta mas limpia.

2
задан 08.01.2017, 06:13
0 ответов

В этом случае, это не функция SUM который ты должен использовать, потому что он не состоит в том, чтобы ты захотел сложить стоимость поля estado. В самом деле, это будет давать тебе неправильные результаты когда estado = 0, потому что сумма всегда будет заканчиваться 0. Скорее, ты хочешь использовать функцию COUNT() чтобы считать реестры со стоимостью estado желаемый:

select count(*)
  from usuario u
  join intento i
    on i.id_u = u.id_u
   and i.estado = ?
 where u.id_u = ?

Редактирование

Если ты хочешь получить счета каждого состояния для пользователя в особенности, ты можешь делать это используя функцию COUNT() с выражением CASE:

select count(case when i.estado = 0 then 'X' end) as cnt_estado_0,
       count(case when i.estado = 1 then 'X' end) as cnt_estado_1
  from usuario u
  join intento i
    on i.id_u = u.id_u
 where u.id_u = ?

И, если желание состоит в том, чтобы получать эти счета для всех пользователей одного, ты можешь изменять консультацию таким образом (замечание, что здесь LEFT JOIN он необходим, если возможно, что у пользователя нет реестров в таблице intento):

select u.id_u,
       count(case when i.estado = 0 then 'X' end) as cnt_estado_0,
       count(case when i.estado = 1 then 'X' end) as cnt_estado_1
  from usuario u
  left join intento i
    on i.id_u = u.id_u
 group by u.id_u
2
ответ дан 03.12.2019, 17:50