我敢肯定,对于一些在 SQL 中有所了解的人来说,这将非常简单,但我认为它需要一个子查询或其他东西。我有一个表,其中基本上有大量订单号和来自 XML API 的回复列。失败或成功。
每次请求后都会在数据库中插入一个全新的行。因此,一个订单号可能有 5 次失败,并且在第 6 次尝试时插入一条记录说成功。
我怎样才能放出旁边只有失败状态的订单号?
这将使我能够弄清楚哪些记录需要查看在 API 请求中持续失败的记录。
试试这个,通过使用主键 (order_id) 对订单进行分组
SELECT * FROM
(
SELECT GROUP_CONCAT(status) as status_combined, order_id
FROM orders
GROUP BY order_id
) AS order_tmp
WHERE status_combined NOT LIKE '%SUCCESS%'
Edit
(根据提问者的评论)
SELECT * FROM
(
SELECT GROUP_CONCAT(status) as status_combined, order_id
FROM orders
JOIN certificates ON certificates.Ordernumber = orders.OrderNumber
GROUP BY order_id
) AS order_tmp
WHERE status_combined NOT LIKE '%SUCCESS%'
请确保您需要根据“Ordernumber”或“order_id”加入
试试这个
select m.*
from Main m
join Transactiontable tt
on m.orderid = tt.orderid
group by tt.status , m.orderid
having count(case when tt.status = "failed") = count(tt.status)
您可以使用 where 子句使用简单的 sql 查询:
select *
from some_table
where Column_From_some_table_has_value = your_particular_value
够了。
你可以看看如何在 sql 中使用 where 子句
谢谢
这可能是最干净的方法:
select *
from mytable
where id in (
select id
from mytable
group by id
having sum(status = 'SUCCESS') = 0)
我不喜欢@Minesh 的回答,因为它同时使用聚合函数和LIKE
运算符。这两者都可能导致性能问题,因为没有任何索引可以帮助查询完成工作中的困难部分。该LIKE
子句尤其需要对数据库进行大量工作,因为它需要扫描每个结果。
我对 SQL Server 更熟悉,但这应该适合你:
SELECT *
FROM Orders
WHERE OrderNumber NOT IN (
SELECT OrderNumber
FROM Orders
WHERE Status = 'SUCCESS')
AND OrderNumber NOT IN (
SELECT OrderNumber
FROM Certificates
WHERE OrderStatus = 'CANCELLED')