Estoy tratando de escribir una declaración MySQLi donde quiero recuperar una columna aleatoria (url) de una tabla llamada (questions). Sin embargo, no quiero cualquier url aleatorio. Esta declaración dependerá de tres condiciones que involucran otra tabla llamada tracking. tracking contiene tres columnas (user_id, q_id, answer). Entonces, en última instancia, quiero recuperar todos los urls que el usuario aún no ha respondido. Por ejemplo, si el usuario ya respondió una pregunta, entonces tracking tendrá algo como esto: user_id: 2 q_id: 2 answer: 1 Ahora, cuando ejecutemos esta declaración, q_id: 2 no debe ser uno de los urls aleatorios. También es importante señalar que q_id también es una clave principal de questions.

Probé esta declaración, pero no funciona por alguna razón:

$values = $db->query("
SELECT url 
  FROM questions 
  LEFT 
  JOIN tracking
    ON tracking.user_id = '$id' 
   AND questions.q_id != tracking.q_id 
   AND tracking.answer != NULL 
 ORDER 
    BY rand() LIMIT 1
");

¿Cómo puedo hacer que se recupere un url aleatorio excepto para las preguntas que ya han sido respondidas por el usuario?

0
user2896120 16 ene. 2017 a las 09:50

1 respuesta

La mejor respuesta

Intenta unirse en un no igual, por lo que terminará con una unión 1: n, que no funciona. (No en este caso).

Prueba algo como esto:

SELECT url FROM questions WHERE q_id NOT IN 
      (SELECT q_id FROM tracking WHERE user_id = $id 
      AND answer IS NOT NULL) 
ORDER BY rand() LIMIT 1   

Y esta no es una forma segura de insertar variables en una consulta, mire las declaraciones preparadas: http://www.w3schools.com/php/php_mysql_prepared_statements.asp

2
Doktor OSwaldo 16 ene. 2017 a las 12:42
Mmm, recibo un error que dice: Call to a member function fetch_array() on a non-object Después de la consulta, lo hago: $rows = $values->fetch_array();
 – 
user2896120
16 ene. 2017 a las 11:02
Pruebe la consulta directamente en su entorno de base de datos (si es posible), o al menos el error de mysql. echo mysql_errno ($ db). ":". mysql_error ($ db). "\norte";
 – 
Doktor OSwaldo
16 ene. 2017 a las 11:05
Hmm, ahora está funcionando, pero la consulta todavía da una URL que ya ha sido respondida por alguna razón ...
 – 
user2896120
16 ene. 2017 a las 11:21
Sí, intenté tener dos preguntas. Fui y respondí ambas preguntas, pero la consulta todavía muestra una de las dos URL.
 – 
user2896120
16 ene. 2017 a las 11:50
Pruebe el SQL middel (SELECT q_id FROM tracking WHERE user_id = '$ id' Y la respuesta NO ES NULL) y observe si devuelve las dos preguntas respondidas (debería). Si no mira su tabla, publique sus dos filas aquí.
 – 
Doktor OSwaldo
16 ene. 2017 a las 11:51