SQLITE valor / fila aleatoria con criterios

Ablis:

Por lo tanto, sé que la pregunta acerca de cómo obtener una fila al azar en la base de datos SQL se han publicado (incluso más de una vez), y me ayudó a llegar a esta consulta SQL:

"SELECT column FROM table WHERE id IN (SELECT id FROM table ORDER BY RANDOM() LIMIT 1)"; 

Si he entendido bien que, para Por casualidad no es eficiente en la mesa grande, pero si lo usa con el id es lo suficientemente rápido.

Así que lo he probado, parece que funciona bien, pero es que quería añadir un criterio, así que he cambiado un poco:

"SELECT column1 FROM table WHERE (column2 LIKE '" + value + "' AND id IN (SELECT id FROM table ORDER BY RANDOM() LIMIT 1)"; 

Para ser más claro, tengo esta tabla: = subidos (id, nombre de archivo, propietario). Quiero seleccionar un nombre de archivo al azar de un propietario determinado. Lo que me da lo siguiente:

"SELECT filename FROM uploaded WHERE (owner LIKE '" + owner + "' AND id IN (SELECT id FROM uploaded ORDER BY RANDOM() LIMIT 1))";

El problema es: a veces, rs.next es falso (que quiere decir que no tengo un resultado). Sin embargo, i imprimir la base de datos antes de buscar el nombre del archivo, así que estoy seguro de que el propietario tiene un nombre de archivo relacionado en este DB. Tal vez sólo uno, pero aún así uno.

Esto me trae a la pregunta: ¿qué le pasa a mi consulta?

AxelH:

Desea obtener un identificador aleatorio para owner, no cualquier ID. Es por eso que obtiene un resultado vacío en algún momento. Se obtiene un ID que no es para OWNER, por lo tanto no son ciertas condiciones.

Así que añadir la condición en esta consulta:

SELECT id FROM uploaded where owner = ? ORDER BY RANDOM() LIMIT 1

No hay necesidad de comprobar dos veces para owner, que ya consiguió una idpara él. Entonces :

SELECT filename FROM uploaded WHERE id IN (
    SELECT id FROM uploaded where owner LIKE ? ORDER BY RANDOM() LIMIT 1
)

PD: esto es utilizando una PreparedStatementnotación.

PreparedStatement stmt = conn.prepareStatement(query);
stmt.setString(1, owner);
ResultSet rs = stmt.executeQuery();

Le sugiero que consulte a evitar la inyección de SQL o se puede reemplazar ?por su String.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=119608&siteId=1
Recomendado
Clasificación