Estoy teniendo problemas para realizar una consulta en mi proyecto universitario. Tengo un sitio web donde los usuarios comparten los libros que han leído y tengo una página donde el usuario puede ver los libros que ha agregado (los libros que posee).

Para eso creo que necesito la identificación del usuario registrado, que almaceno en una variable PHP de sesión, la identificación del usuario está en los usuarios de la tabla. La información sobre los libros se almacena en una tabla de libros y tiene su propia clave primaria de identificación. Luego, para mostrar quién posee lo que tengo, una tabla owns_book (id, u_id, book_id).

En este momento para las pruebas, tengo 26 libros en total, 25 de ellos son agregados por un usuario con un ID de 57 y 1 libro por usuario con un ID de 49. Cuando ejecuto esta consulta:

SELECT id, title, author, category, cover, added, user_id FROM books, users 
WHERE user_id=49 AND id IN(SELECT book_id FROM owns_book) 
AND user_id IN(SELECT u_id FROM owns_book)

Y el resultado es un desastre, no obtengo el libro esperado, también obtengo libros agregados por el otro usuario. ¿Alguien puede mostrarme la consulta correcta que necesito o si necesito cambiar la estructura de mis tablas? Gracias.

Editar:

users(user_id, ...) 
books(id, title, author, publisher, published, cover... ) 
owns_book(id, u_id, book_id)
0
green_03 23 ene. 2018 a las 22:04

3 respuestas

La mejor respuesta

Parece que estás buscando agarrar todo de tu mesa de libros que es propiedad de un cliente específico. Si ese es el caso, puedes intentar

SELECT * FROM books 
JOIN owns_book 
ON books.id = owns_books.book_id 
WHERE owns_book.user_id = 49 

Esto seleccionará todos los accesorios de la tabla de libros y luego se unirá a las tablas en función de que la ID del libro sea igual al book_id del owns_book. Por último, agregue el parámetro: solo desea ver user_id = 49.

2
Kris Ariganello 23 ene. 2018 a las 19:22

También puede usar la unión interna para unir las tablas users y books con la tabla owns_book:

SELECT id, title, author, category, cover, added, user_id 
    FROM owns_book 
    INNER JOIN users ON users.id = owns_book.u_id
    INNER JOIN books ON books.id = owns_book.book_id
    WHERE users.user_id=49
0
eol 23 ene. 2018 a las 19:15

Puede simplificar esta consulta y usar una IZQUIERDA ÚNICA ...

SELECT books.id, title, author, category, cover, added, users.user_id 
    FROM users 
    LEFT JOIN owns_book on owns_book.user_id = users.user_id
    LEFT JOIN books on books.id = owns_book.id
    WHERE users.user_id=49

Esto vincula user_id y enumera todos los libros que pertenecen a este user_id (el bit ON de JOIN). La cláusula WHERE solo limita la lista de registros para el user_id your after.

Si en la lista principal de columnas, hay una columna en varias tablas (como id_usuario), entonces agregue el prefijo con el nombre de la tabla para permitir que la base de datos detecte qué columna desea usar (aunque puedan tener el mismo valor).

1
Nigel Ren 23 ene. 2018 a las 19:18