Tengo dos tablas similares a continuación

Si tenemos una mesa de carrito de compras como carritos es como a continuación

id     date     title
---------------------
1      2016       a
2      2015       b
3      2018       c
4      2019       dd

Y la tabla de productos es algo como a continuación

id     cart_id    status
--------------------------
1         2        paid
2         2        paid
3         1        paid
4         1        unpaid
5         1        paid
6         3        paid
7         3        paid

La salida esperada (solo carritos en los que se ha pagado todo el producto) es:

cart_id    status
-------------------
   3        paid
   2        paid
-2
shohreh shiran 11 may. 2019 a las 12:01

3 respuestas

La mejor respuesta

Puede group by cart_id y con una cláusula HAVING aplicar la condición de que no hay un valor 'unpaid' en la columna status:

select cart_id, max(status) status
from product
group by cart_id
having sum(status = 'unpaid') = 0

Supongo que en la columna status los únicos valores posibles son 'paid' y 'unpaid', por lo que en lugar de max(status) status puede usar 'paid' status como la segunda columna. < br /> O con NO EXISTE:

select distinct p.cart_id, p.status
from product p
where not exists (
  select 1 from product
  where cart_id = p.cart_id and status = 'unpaid'
)

Consulte la demo.
Resultados:

| cart_id | status |
| ------- | ------ |
| 2       | paid   |
| 3       | paid   |
0
forpas 12 may. 2019 a las 08:24

Pruebe este código ajustado

SELECT carts.id,'Paid' Status
FROM carts
INNER JOIN product on carts.id = product.cart_id
GROUP BY carts.id
HAVING COUNT(Status) = SUM(CASE WHEN status = 'Paid' THEN 1 ELSE 0 END)
0
mkRabbani 12 may. 2019 a las 11:57

Esta parece la lógica más simple:

select p.cart_id, p.status
from product p
where p.status = 'paid';
0
Gordon Linoff 11 may. 2019 a las 11:28