在一行中选择具有相似值的行

时间:2018-11-12 08:24:24

标签: mysql

我有一个名为trades的表,并且具有一个字段会话ID。该表具有带有类似会话ID的特定行。某些行具有类似会话ID的原因是,在进行交易时,它需要一个现有的会话ID。

我现在想选择具有相似会话ID的行并对其进行处理。

这是我第一个列出所有行的查询

SELECT * FROM trades 
where trade_session_status="DONE" AND 
      trade_profit_worker_status="UNDONE" 

我也尝试过此查询

SELECT * FROM trades 
where trade_session_status="DONE" AND 
      trade_profit_worker_status="UNDONE" 
order BY(session_id)

我查看了不同的查询并提出了该查询

SELECT DISTINCT session_id,id 
FROM trades 
WHERE trade_session_status="DONE" AND 
      trade_profit_worker_status="UNDONE"  
ORDER BY session_id

#2和#3查询都返回相同数量的行。我的问题是,#2和#3查询是否总是返回具有不同session_id的行,而不会遗漏任何行?。

1 个答案:

答案 0 :(得分:0)

对我来说,您可以为此使用EXISTS。

SELECT * 
FROM trades t
WHERE trade_session_status = 'DONE' 
  AND trade_profit_worker_status = 'UNDONE'
  AND EXISTS 
      (
        SELECT 1
        FROM trades d
        WHERE d.trade_session_status = 'DONE' 
          AND d.trade_profit_worker_status = 'UNDONE'
          AND d.session_id = t.session_id
          AND d.id <> t.id
      );

请注意,在EXISTS的查询中也使用了trade_session_status和trade_profit_worker_status的条件。我不知道您是否需要这样做,所以如果您不希望这样做,请删除它们。但是你明白了。

另一种方法是使用重复的session_id对内部子查询进行联接。

SELECT t.* 
FROM trades t
JOIN 
(
   SELECT session_id
   FROM trades
   WHERE trade_session_status = 'DONE' 
     AND trade_profit_worker_status = 'UNDONE'
   GROUP BY session_id
   HAVING COUNT(*) > 1
) d ON d.session_id = t.session_id
WHERE t.trade_session_status = 'DONE'
  AND t.trade_profit_worker_status = 'UNDONE';