¿Como contar los ultimos registros que se ajusten a una condicion?

Quiero contar los últimos registros cuando cumplen que:

  1. su estado es igual a 1
  2. si el usuario_id es igual 5, y
  3. el test_id es igual a 1

El número máximo de registros a contar es sólo 3.

Estos registros los tengo en una tabla con la siguiente estructura:

Estructura de la tabla mysql

Intenté con count() y limit de esta forma:

public function cuenta($usuarioID,$testID){
    $consulta = "SELECT COUNT(*) AS total 
                   FROM (SELECT 1 
                           FROM repuestas 
                          WHERE estado = 1 
                            AND usuario_id = '$usuarioID' 
                            AND test_id = '$testID'
                          ORDER BY id DESC 
                          LIMIT 3,3) t";

    $resultado = $this->_db->query($consulta) or die(print_r($this->_db->errorInfo()));
    return $resultado->fetch(PDO::FETCH_ASSOC);
}

El problema que presenta esta consulta es que cuenta todos los que tengan estado en 1, y eso daría 3 (por el limit 3).

Pero si observan la imagen en los últimos 3 registros sólo el 44 tiene estado en 1, y eso me debería arrojar:

que de entre los 3 últimos, sólo 1 tiene estado en 1.

0
задан 30.10.2016, 03:20
3 ответа

То, что я понимаю, состоит в том, что ты хочешь найти последние 3 реестра для специфической комбинации usuario_id и test_id. И, потом, между этими последними 3 реестрами, ты хочешь рассказать, сколькие у них есть estado_id = 1.

Если я понял хорошо вопрос, тогда это консультация SQL, в которой ты нуждаешься:

select count(case when estado_id = 1 then 'X' end)
  from (select estado_id
          from repuestas
         where usuario_id = 5 -- aquí usarías $usuarioID, estoy usando 5 como ejemplo.
           and test_id = 1 -- aquí usarías $testID, estoy usando 1 como ejemplo.
         order by id desc
         limit 3) t

или эта также эквивалентная:

select count(*)
  from (select estado_id
          from repuestas
         where usuario_id = 5 -- aquí usarías $usuarioID, estoy usando 5 como ejemplo.
           and test_id = 1 -- aquí usarías $testID, estoy usando 1 como ejemplo.
         order by id desc
         limit 3) t
 where estado_id = 1

SQL, объединенный с твоим кодом PHP

public function cuenta($usuarioID,$testID){
    $consulta = "select count(case when estado = 1 then 'X' end) as total 
                   from (select estado_id
                           from repuestas 
                          where usuario_id = '$usuarioID' 
                            and test_id = '$testID'
                          order by id desc
                          limit 3) t";

    $resultado = $this->_db->query($consulta) or die(print_r($this->_db->errorInfo()));
    return $resultado->fetch(PDO::FETCH_ASSOC);
}

или...

public function cuenta($usuarioID,$testID){
    $consulta = "select count(*) as total 
                   from (select estado_id
                           from repuestas 
                          where usuario_id = '$usuarioID' 
                            and test_id = '$testID'
                          order by id desc
                          limit 3) t
                  where estado_id = 1";

    $resultado = $this->_db->query($consulta) or die(print_r($this->_db->errorInfo()));
    return $resultado->fetch(PDO::FETCH_ASSOC);
}
2
ответ дан 24.11.2019, 12:51
  • 1
    В действительности $usuarioID и $testID это определять и # 225; стоимость, которой он мстит в переменной. В этом случае он кажется того, чтобы быть всегда тем же самым, но мы не знаем, есть ли у оставшейся части таблицы другая отличная стоимость для этих двух полей или нет. – Francisco Romero 30.10.2016, 03:00
  • 2
    @Error404: Конечно и OP может использовать переменные в Ваш c и # 243; я говорю. Мой ответ концентрируется на SQL, не волнуя меня переменных. Но я буду налаживать мой ответ, чтобы прояснять. Спасибо. – sstan 30.10.2016, 03:04
  • 3
    переменная различные $usuarioID относительно пользователя, который вошел в систему и $testID, определяет тест, что присутствующий вышеупомянутый пользователь код уже был осуществлен, и функционирует тысячи чудес только, что estado_id не, потому что он говорил, что он не существовал, это сменил на *, и функционировала тысяча спасибо: D – jsoe jose 30.10.2016, 05:43
  • 4
    @jsoe: Возможно даже имей и # 237; схвати select 1. Поскольку ты можешь видеть, я это cambi и # 233; в select estado_id. Он радует меня, что оно ты функционировало. – sstan 30.10.2016, 05:47
  • 5
    Ты снял меня получающая jejeje. Sospech и # 233; на select 1 и нем pregunt и # 233; но как я воспринимаюсь ответ pens и # 233; что это было чем-то, что hab и # 237; в созданный и #233; l для консультации, хотя он был похож очень редкий xD – Francisco Romero 30.10.2016, 12:26

Консультация всегда будет давать тебе как результат 3 благодаря тому, что ты используешь estado = 1 как я просачиваюсь. Из-за многого, который ты использовал limit 3 он возьмет тебе последние три реестра, которые у них есть estado = 1а именно, те, которые у них есть, пойдите 44, 43 и 42, так как ты не имеешь в виду реестры, которые у них есть estado = 0.

Просто удали твоей консультации estado = 1.

Кроме того, другая ошибка, которую я нашел в твоей консультации, - LIMIT, который у тебя есть. Это у тебя есть как LIMIT 3,3 или то, что является тем же самым, LIMIT 3 OFFSET 3. Следовательно, твоя консультация возьмет последние три реестра начиная с четверти из-за конца (вмещаясь они пойдите 43, 42 и 41, которые у них есть estado = 1).

Чтобы упорядочивать ее совсем помести просто LIMIT 3.

Твоя конечная консультация осталась бы как:

$consulta = "SELECT COUNT(*) AS total FROM (SELECT 1 FROM repuestas WHERE usuario_id = '$usuarioID' AND test_id = '$testID' ORDER BY id DESC LIMIT 3) t";
1
ответ дан 24.11.2019, 12:51
  • 1
    Уже я это протестировал и я бросаюсь хорошие 3, если у меня есть что-либо подобное: состояние 0 0 1 сказал бы мне, что только есть один взамен, если у меня есть что-либо подобное: состояние 0 1 1 сказал бы мне, что у меня есть 2, и если бы это было состояние, 1 1 1 сказал бы мне, что у меня есть 3, это, что я хочу, чтобы он сделал мою консультацию: D. – jsoe jose 30.10.2016, 02:54
  • 2
    @jsoejose у Меня Есть сомнение. и #191; Потому что ты делаешь SELECT 1? Сейчас я проверяю твою консультацию снова. – Francisco Romero 30.10.2016, 02:58
  • 3
    @jsoejose Конечно, и #191; что возвращает тебе стоимость и #39; $testID и # 39;? – Francisco Romero 30.10.2016, 02:59
  • 4
    хороший эта переменная и #39; $testID и # 39; я vuelve 5 и SELECT 1 я это помещаю, из-за которого консультация, которую ты видишь между скобками, как optuve этой страницы сочетается count (*) и limit , и я изменил ее немножко: D – jsoe jose 30.10.2016, 03:03

проблема, которая у меня есть, состоит в том, что он не считает последние три реестра, если не последние 3, что Вашего состояния было 1, и брось, что у меня есть 3, когда я в действительности был бы должен бросать 1. с уже большое спасибо из-за помощи, которую они могут предоставлять :D

Тогда удали WHERE estado = 1 Так как ты показываешь в консультации, что я только считал реестры с состоянием, равным 1.

0
ответ дан 24.11.2019, 12:51
  • 1
    уже эта начала и консультация остается такой public function cuenta($usuarioID,$testID){ $consulta = "SELECT COUNT(*) AS total FROM (SELECT 1 FROM repuestas WHERE usuario_id = '$usuarioID' AND test_id = '$testID' ORDER BY id DESC LIMIT 3,3) t"; $resultado = $this->_db->query($consulta) or die(print_r($this->_db->errorInfo())); return $resultado->fetch(PDO::FETCH_ASSOC); }, но продолжает один говоря, что их 3 и не один, дело в том, что ему нужен distinc? – jsoe jose 30.10.2016, 02:48