Вы всегда должны размещать все объединения после предложения FROM . Один за другим.
SELECT a.shop_id,
a.product_id,
a.position,
b.category_id,
c.book_name
FROM X AS a
JOIN Y AS b
ON a.product_id = CAST(b.id AS bigint)
JOIN Z AS c
ON a.product_id = CAST(c.id AS bigint)
WHERE site_id = 1
GROUP BY a.shop_id, a.product_id, b.category_id, a.position
Кроме того, помните, что существуют различные типы объединений. В этом случае вы используете внутреннее объединение , которое будет возвращать все записи из 3 таблиц, где выполняется условие объединения.
Пожалуйста, найдите эту полезную ссылку, если хотите прочитайте немного больше о других типах объединений. Я нашел это очень удобным.
SQL Типы регистрации
Надеюсь, эта помощь!