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中关于变量的文档。然后运行子查询以查看结果(可能只是一个或两个转换的结果)。