query returns the same value multiple times
The query returns the same record multiple times. 


Variants: 


one of source tables (or even both) contains duplicates; 
the records are NOT duplicates, there exists at least one field (in a record pair which seems to be duplicates for you) where values differs.



  the table Keys contains multiple equal values of Bnumber, but that is required because 1 Book has multiple keywords. 


It is variant 2. 

You make a mistake while thinking that the records are duplicates. They differs - at least in Keyword field taken from Keys table.

You may "compress" the output obtaining one book per recodset by grouping and concatenating all keys into one field with keys list separated by comma:

SELECT Books.id, 
       Books.Bnumber, 
    /* another fields from Books table */
       GROUP_CONCAT(Keys.Keyword) Keys_list
FROM Books  
JOIN Keys ON Books.Bnumber = Keys.Bnumber
/* all WHERE conditions which you need */
GROUP BY Books.id, 
         Books.Bnumber, 
      /* another fields from Books table */