我有三个表cards (id,...)
order_cards (card_id, order_id....)
transactions (order_card_id, status, ....)
我想获取最近 7 笔交易失败的所有卡
我正在尝试类似的东西
select cards.*,
(
select sum(case tmp1.status when 'fail' then 1 else 0 end) from
(select transactions.status from order_cards
left join transactions on transactions.order_card_id = order_cards.id
where order_cards.card_id = cards.id
order by transactions.id desc limit 7
) as tmp1
) as total_fail
from cards
group by cards.id
having total_fail > 5
收到此错误
Unknown column 'cards.id' in 'where clause'
上述查询的问题是父 ID 在级别 2 子查询中不起作用。 尝试使用带有计数的子句,但它不适用于限制 任何建议谢谢
已经尝试过
在子查询的子查询中使用父查询的列
MYSQL - 获取同一 id 具有 1 条以上记录的所有记录
我认为parent-id
s 不能在 FROM 子句的派生表中使用,但仍然可以在子查询的 WHERE 子句和 SELECT 列表中访问。因此,在您的情况下,您可以找到card_id的第 8 个最新 transaction.id(LIMIT 7,1
),然后根据该 transaction.id 进行SUM()
:(注意当同一card_id中的事务少于 8 个时,LIMIT 7,1
将返回 NULL,在这种情况下,应计算所有事务,因此如下:t1.id > IFNULL((...), 0)
):
SELECT c.*
, IFNULL((
SELECT sum(t1.status = 'fail')
FROM order_cards o1
JOIN transactions t1 on t1.order_card_id = o1.id
WHERE o1.card_id = c.id
AND t1.id > IFNULL((
SELECT t2.id
FROM order_cards o2
JOIN transactions t2 on t2.order_card_id = o2.id
WHERE o2.card_id = c.id
ORDER BY t2.id DESC
LIMIT 7,1
), 0)
), 0) as total_fail
FROM cards c
HAVING total_fail > 5
我在我自己的服务器的数据库上测试了一个类似的SQL,它工作正常,同样的方法可能适用于您的情况。
这应该有效。
Select c.*, SUM(t.status = 'FAILED') AS failed_txns
from cards c, order_cards oc, transactions t
where t.status='FAILED'
and oc.order_id = t.order_card_id
and c.id = oc.card_id
group by c.id
having failed_txns >= 7