Mysql 如何根据SQL中的条件选择组中的行?

Mysql 如何根据SQL中的条件选择组中的行?,mysql,sql,select,group-by,Mysql,Sql,Select,Group By,问题 请考虑下表: +--------------+--------+--------+ | transactionID | Sgroup | Rgroup | +--------------+--------+--------+ | 1 | A | I | | 1 | A | J | | 2 | B | B | | 2 | B | K

问题 请考虑下表:

+--------------+--------+--------+
| transactionID | Sgroup | Rgroup |
+--------------+--------+--------+
|            1 | A      | I      |
|            1 | A      | J      |
|            2 | B      | B      |
|            2 | B      | K      |
+--------------+--------+--------+
对于每个
transactionID
(两行与ID 1关联,两行与ID 2关联)如果
transactionID
中的任何行满足条件,我想选择
Sgroup=Rgroup
的行。否则,我想随机选择一行。对于每个
transactionID
最多一行满足
Sgroup=Rgroup
。我该怎么做

尝试的解决方案 我知道如何选择满足条件
Sgroup=Rgroup
的行,如下所示:

SELECT *
FROM Transaction 
WHERE Sgroup = Rgroup;

+---------------+--------+--------+
| transactionID | Sgroup | Rgroup |
+---------------+--------+--------+
|             2 | B      | B      |
+---------------+--------+--------+
SELECT * FROM
(SELECT *
FROM Transaction
WHERE NOT transactionID IN
(SELECT transactionID
FROM Transaction 
WHERE Sgroup = Rgroup)
ORDER BY RAND()) AS temp
GROUP BY temp.transactionID;

+---------------+--------+--------+
| transactionID | Sgroup | Rgroup |
+---------------+--------+--------+
|             1 | A      | I      |
+---------------+--------+--------+
我还知道如果条件未满足以下条件,如何随机选择一行(感谢):

SELECT *
FROM Transaction 
WHERE Sgroup = Rgroup;

+---------------+--------+--------+
| transactionID | Sgroup | Rgroup |
+---------------+--------+--------+
|             2 | B      | B      |
+---------------+--------+--------+
SELECT * FROM
(SELECT *
FROM Transaction
WHERE NOT transactionID IN
(SELECT transactionID
FROM Transaction 
WHERE Sgroup = Rgroup)
ORDER BY RAND()) AS temp
GROUP BY temp.transactionID;

+---------------+--------+--------+
| transactionID | Sgroup | Rgroup |
+---------------+--------+--------+
|             1 | A      | I      |
+---------------+--------+--------+
如何将这两个表达式组合成一个表达式?我试着用一个CASE表达式工作,但我没走多远。有人能提出解决办法吗

示例代码以下是生成表格的代码:

CREATE DATABASE MinimalExample;
USE MinimalExample;

CREATE TABLE Transaction (
transactionID int,
Sgroup nvarchar(1),
Rgroup nvarchar(1)
);

INSERT INTO Transaction VALUES
(1,'A','I'), 
(1,'A','J'),
(2,'B','B'),
(2,'B','K');

我认为变量可能是最简单的解决方案,如果你真的是指“随机”:

如果你所说的“随机”是指“任意”,你可以使用这个快速而肮脏的技巧:

(select t.*
 from t
 where sgroup = rgroup
)
union all
(select t.*
 from t
 where not exists (select 1 from t t2 where t2.id = t.id and t2.sgroup = t2.rgroup)
 group by transactionID
);
这使用了可怕的
select*
groupby
,我强烈建议在几乎所有情况下都不要使用。然而,在本例中,您特别尝试将每个组减少到一个不确定的行,因此看起来并没有那么糟糕。我将注意到,MySQL不能保证结果集中的列都来自同一行,尽管在实践中确实如此

最后,如果每行上都有唯一的主键,则可以使用最简单的解决方案:

select t.*
from t
where t.id = (select t2.id
              from t t2
              where t2.transactionID = t.transactionID
              order by (rgroup = sgroup) desc, rand()
             );

非常感谢您的回答!第一个(最简单的)解决方案对我来说非常有趣并且有效,但我并不完全理解它。你能描述一下吗?@fabian。阅读MySQL中关于变量的文档。然后运行子查询以查看结果(可能只是一个或两个转换的结果)。