SELECT
c.id_cart,
c.date_upd,
cs.firstname,
cs.lastname,
addr.phone_mobile,
c.id_product,
c.name,
c.quantity,
c.amount
FROM
(
SELECT
c.*,
max(o.date_upd) o_date_upd
FROM
(
SELECT
c.id_cart,
c.id_customer,
c.date_upd,
c.id_address_delivery,
cp.id_product,
pl.name,
sum(cp.quantity) quantity,
sum(cp.quantity * ps.price) amount
FROM
`ps_cart` c
left join `ps_cart_product` cp ON c.id_cart = cp.id_cart
and c.id_shop = cp.id_shop
left join `ps_product_shop` ps ON cp.id_product = ps.id_product
and ps.id_shop = cp.id_shop
left join `ps_product_lang` pl ON cp.id_product = pl.id_product
and pl.id_shop = cp.id_shop and pl.id_lang = 1
left join `ps_orders` o ON c.id_cart = o.id_cart
where
c.id_customer > 0
AND o.id_cart is NULL
AND DATE_ADD(NOW(), INTERVAL -8 * 3600 SECOND) >= c.date_upd
group by
c.id_cart,
c.id_customer,
c.date_upd,
c.id_address_delivery,
cp.id_product,
pl.name
having
sum(cp.quantity) > 0
) c
left join `ps_orders` o ON not c.id_cart = o.id_cart
AND c.id_customer = o.id_customer
group by
c.id_cart,
c.id_customer,
c.date_upd,
c.id_product,
c.name,
c.quantity,
c.amount
having
DATEDIFF(
c.date_upd,
max(o.date_upd)
) > 30
OR max(o.date_upd) is NULL
) c
LEFT JOIN `ps_customer` cs ON c.id_customer = cs.id_customer
LEFT JOIN `ps_address` as addr ON c.id_address_delivery = addr.id_address
where
DATEDIFF(now(), c.date_upd) <= 7
order by
c.id_cart DESC
P.S.
Выбираются корзины, у которых зарегистрирован клиент и этот клиент не оформил заказ и последнее обновление позже чем 8 часов назад было.
Также для себя я отсекаю корзины старше 7 дней (DATEDIFF(now(), c.date_upd) <= 7), так как мне приходит рассылка раз в день. Для твоих нужд может и не понадобится это условие.