Esto te podira servirte:
Código:
SELECT DISTINCT c.nombres, c.apellidos
FROM clientes AS c, ventas AS v, libro AS l
WHERE c.numerodocumento = v.numerodocumento
AND v.codbarralibro = l.codbarralibro
AND v.fechaventa > DATE_SUB(CURDATE(), INTERVAL 6 MONTH)
AND v.fechaventa
IN (SELECT MAX(fechaventa) AS ultima_compra
FROM ventas GROUP BY codcliente)
Solo tendrias que ajustarlo ya que no vi el
codcliente, pero este seria el camino.
Suerte.