MySQL - Especificar condición conjunta y excluyente de columnas con WHERE múltiples veces

 
Vista:
sin imagen de perfil
Val: 1
Ha disminuido su posición en 3 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

Especificar condición conjunta y excluyente de columnas con WHERE múltiples veces

Publicado por santa (1 intervención) el 17/09/2018 19:14:30
Pues estoy utilizando MYSQL y no consigo especificar unas columnas especificas múltiples veces. Se que el código siguiente esta mal pero es para entender mejor lo que intento hacer.

Nota: id_seguir_libro = id del libro

Necesito especificar en la misma consulta, que de id_seguir_libro seleccione unos id en especifico y con unos capítulos concretos. Con IN no me sirve, porque seleccionaría los id de seguir los libros bien, pero entonces no cogería los capítulos correctos para cada seguimiento. Puede que el usuario no este siguiendo un libro o id_seguir_libro, puede incluso que no este siguiendo ninguno. Lo que intento es que devuelva los que si esta siguiendo

1
2
3
4
5
6
7
SELECT id_seguir_libro, numero_capitulo
FROM Seguir, Capitulos
WHERE id_usuario = 1 AND
id_seguir_libro = id_libro_capitulo AND
(id_seguir_libro = 15 AND numero_capitulo = (10+1)) AND/OR
(id_seguir_libro = 25 AND numero_capitulo = (5+1)) AND/OR
(id_seguir_libro = 30 AND numero_capitulo = (23+1))

También he probado hacerlo con CASE WHEN, pero tampoco sale.
La suma de números es que son variables.

1
2
3
4
5
6
7
8
Seguir                                      Capitulos
 
    id_follow_book   id_usuario                 id_chapter_book   num_chapt
        30             1                              30                   6
        25             1                              30                   5
        13             1                              30                   4
        21             1                              25                  24
                                                      25                  23

Resultado esperado:

1
2
3
id_seguir_libro    numero_capitulo
          30                  6
          25                 24
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: 956
Oro
Ha aumentado 1 puesto en MySQL (en relación al último mes)
Gráfica de MySQL

Especificar condición conjunta y excluyente de columnas con WHERE múltiples veces

Publicado por Leonardo Josué (414 intervenciones) el 18/09/2018 22:20:30
Hola Santa:

No estoy seguro de haber entendido correctamente, pero creo que el problema que tienes es porque estás mezclando operadores AND y OR sin considerar que estos tienen una jerarquía distinta. Al igual que en matemáticas no es lo mismo

1
2+3*4 = 14         a          (2+3) * 4 = 20

lo mismo pasa con los AND y los OR, ya que el AND de ejecuta primero que los OR. Tampoco me queda claro cómo es que vas a filtrar los datos de acuerdo a tus parámetros, pero con lo que pones de ejemplo, podrías hacer esto:

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
30
31
32
33
34
35
36
37
38
39
40
41
mysql> SELECT * FROM seguir;
+-----------------+------------+
| id_seguir_libro | id_usuario |
+-----------------+------------+
|              30 |          1 |
|              25 |          1 |
|              13 |          1 |
|              21 |          1 |
+-----------------+------------+
4 rows in set (0.02 sec)
 
mysql> SELECT * FROM capitulos;
+-------------------+-----------------+
| id_libro_capitulo | numero_capitulo |
+-------------------+-----------------+
|                30 |               6 |
|                30 |               5 |
|                30 |               4 |
|                25 |              24 |
|                25 |              23 |
+-------------------+-----------------+
5 rows in set (0.00 sec)
 
mysql> SELECT id_seguir_libro, numero_capitulo
    -> FROM Seguir, Capitulos
    -> WHERE
    ->   id_seguir_libro = id_libro_capitulo
    ->   AND id_usuario = 1
    ->   AND
    ->   (
    ->     (id_seguir_libro = 15 AND numero_capitulo in (10+1, 5+1, 23+1)) or
    ->     (id_seguir_libro = 25 AND numero_capitulo in (10+1, 5+1, 23+1)) or
    ->     (id_seguir_libro = 30 AND numero_capitulo in (10+1, 5+1, 23+1))
    ->   );
+-----------------+-----------------+
| id_seguir_libro | numero_capitulo |
+-----------------+-----------------+
|              30 |               6 |
|              25 |              24 |
+-----------------+-----------------+
2 rows in set (0.00 sec)ndido

O mejor aun, puedes usar JOIN's explícitos en lugar de listar las tablas en el FROM, es decir, algo así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mysql> SELECT id_seguir_libro, numero_capitulo
    -> FROM Seguir
    -> INNER JOIN Capitulos ON id_seguir_libro = id_libro_capitulo
    -> WHERE
    ->   id_usuario = 1
    ->   AND
    ->   (
    ->     (id_seguir_libro = 15 AND numero_capitulo in (10+1, 5+1, 23+1)) or
    ->     (id_seguir_libro = 25 AND numero_capitulo in (10+1, 5+1, 23+1)) or
    ->     (id_seguir_libro = 30 AND numero_capitulo in (10+1, 5+1, 23+1))
    ->   );
+-----------------+-----------------+
| id_seguir_libro | numero_capitulo |
+-----------------+-----------------+
|              30 |               6 |
|              25 |              24 |
+-----------------+-----------------+
2 rows in set (0.00 sec)

Haz la prueba y nos comentas.

Saludos
Leo.
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