SQL - No logro hacer una consulta, parece fácil pero no lo veo

 
Vista:
sin imagen de perfil
Val: 5
Ha aumentado su posición en 19 puestos en SQL (en relación al último mes)
Gráfica de SQL

No logro hacer una consulta, parece fácil pero no lo veo

Publicado por Paco (3 intervenciones) el 23/12/2019 21:32:48
Tabla peliculas

1
2
3
4
5
6
7
8
9
sql = "CREATE TABLE peliculas (" +
    " id INTEGER PRIMARY KEY AUTO_INCREMENT," +
    " id_pelicula VARCHAR(30) UNIQUE," +
    " titulo VARCHAR(100)," +
    " imagen_portada VARCHAR(300), " +
    " imagen_fondo VARCHAR(300)," +
    " descripcion TEXT," +
    " fecha DATE" +
    " );";

Tabla generos

1
2
3
4
5
6
7
8
sql = "CREATE TABLE generos (\n" +
    " id INTEGER PRIMARY KEY AUTO_INCREMENT, \n" +
    " id_genero VARCHAR(30) UNIQUE,\n" +
    " nombre VARCHAR(60)\n" +
    " );";
 
    "ALTER TABLE peliculas_generos ADD FOREIGN KEY (id_pelicula) REFERENCES peliculas(id_pelicula);\n" +
    "ALTER TABLE peliculas_generos ADD FOREIGN KEY (id_genero) REFERENCES generos(id_genero);";

Os explico, quiero sacar las películas que cumplan con los géneros que les pase.
Os pongo lo que he probado.

1
2
3
4
5
6
7
8
9
SELECT count(PELICULAS_GENEROS.id)
FROM peliculas
LEFT JOIN
PELICULAS_GENEROS
on PELICULAS.ID_PELICULA=PELICULAS_GENEROS.ID_PELICULA
GROUP BY PELICULAS_GENEROS.ID_PELICULA
HAVING PELICULAS_GENEROS.ID_GENERO='2313'
  AND PELICULAS_GENEROS.ID_GENERO='1231233'
  AND PELICULAS_GENEROS.ID_GENERO='rer'


1
2
3
4
5
6
7
8
9
SELECT *
FROM peliculas
LEFT JOIN
PELICULAS_GENEROS
on PELICULAS.ID_PELICULA=PELICULAS_GENEROS.ID_PELICULA
WHERE 1
AND PELICULAS_GENEROS.ID_GENERO='2313'
AND PELICULAS_GENEROS.ID_GENERO='1231233'
AND PELICULAS_GENEROS.ID_GENERO='rer'

NO funciona nada, con los OR si pero no es lo que quiero hacer ya que me sacaría películas de terror o de comedia, pero yo quiero que saquen las películas de terror y comedia.

A ver si alguien arroja luz al asunto porque llevo aquí pegado 4 horas y he consultado a mis compañero de clase y nadie sabe.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 5
Ha aumentado su posición en 19 puestos en SQL (en relación al último mes)
Gráfica de SQL

No logro hacer una consulta, parece fácil pero no lo veo

Publicado por Paco (3 intervenciones) el 23/12/2019 22:30:31
Creo que lo he resuelto. por si le sirve a alguien. FILTRAR EN UNA TABLA DE MUCHOS A MUCHOS POR VARIOS ID A LA VEZ.

1
2
3
4
5
6
7
8
9
10
11
SELECT DISTINCT (ID_PELICULA)
FROM PELICULAS_GENEROS
WHERE 1
  AND id_pelicula IN (SELECT ID_PELICULA
    FROM PELICULAS_GENEROS
    WHERE 1
  AND PELICULAS_GENEROS.ID_GENERO='2313')
  AND id_pelicula IN (SELECT ID_PELICULA
    FROM PELICULAS_GENEROS
    WHERE 1
  AND PELICULAS_GENEROS.ID_GENERO='rer')

por cada genero que se filtre habría que hacer una subconsulta nueva.

También lo ha logrado un compañero con INNER JOINS.

1
SELECT * FROM peliculas left JOIN conexion c1 on peliculas.Id = c1.pelicula left JOIN conexion c2 on peliculas.Id = c2.pelicula WHERE c1.genero = 2 AND c2.genero = 3

Lo mismo, por cada filtro de genero habria que usar un inner join.

Espero que le sirva a alguien, he buscado mucho y no he encontrado nada como esto. Si podéis cambiar el nombre del post para que la gente lo busque mejor, no estaría mal.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 5
Ha aumentado su posición en 19 puestos en SQL (en relación al último mes)
Gráfica de SQL

No logro hacer una consulta, parece fácil pero no lo veo

Publicado por Paco (3 intervenciones) el 23/12/2019 22:52:51
los where 1 lo podéis omitir por que genero las subconsuttas, y en caso de que no se filtre por nada entonces me saca todo los registros. Os pongo aquí para que lo comprendáis mejor.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public List<Pelicula> listAllFilterGenero(List<Genero> generos) {
    List<Pelicula> lista = new ArrayList<Pelicula>();
    error = false;
    String condicion="";
    for (Genero genero: generos
    ) {
        condicion+=" AND id_pelicula IN (SELECT ID_PELICULA" +
                "    FROM PELICULAS_GENEROS" +
                "  AND PELICULAS_GENEROS.ID_GENERO='"+genero.getIdGenero()+"')";
    }
    String sql ="SELECT DISTINCT(ID_PELICULA)" +
            "FROM PELICULAS_GENEROS" +
            " WHERE 1" + condicion;
    try {
        ResultSet rs = getStatement().executeQuery(sql);
 
        while (rs.next()) {
            lista.add(itemToEntityExtra(rs));
        }
        rs.close();
    } catch (SQLException ex) {
        error = true;
    }
    return lista;
}
 
private Pelicula itemToEntityExtra(ResultSet rs) throws SQLException {
    return PeliculasDao.connect().get(new Pelicula(rs.getString("id_pelicula")));
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar