我有一个名为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的行,而不会遗漏任何行?。
答案 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';