如何只提取对他们有失败的记录?

时间:2013-01-31 10:14:38

标签: mysql sql

我确信这对于SQL中的某些人来说非常简单,但我认为它需要一个子查询或其他东西。我有一个基本上有一个订单号加载的表和一个XML API的回复列。无论是失败还是成功。

每次请求后都会在DB中插入一个全新的行。因此,对于一个订单号可能有5个FAILS,并且在第6次尝试时会插入一条记录,表示SUCCESS。

如何才能发出仅在其旁边有失败状态的订单号?

这将允许我弄清楚需要查看哪些记录在API请求中持续失败。

5 个答案:

答案 0 :(得分:1)

尝试使用主键(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”

加入

答案 1 :(得分:0)

试试这个

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)

答案 2 :(得分:0)

您可以使用where子句来使用简单的SQL查询:

select * 
from some_table 
where Column_From_some_table_has_value = your_particular_value 

那就够了。

您可以查看How to use where clause in sql

由于

答案 3 :(得分:0)

这可能是最干净的方法:

select *
from mytable
where id in (
    select id
    from mytable
    group by id
    having sum(status = 'SUCCESS') = 0)

答案 4 :(得分: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')