所以我一直在思考如何解决这个问题,但我还不知道。 我有一个表'A',其中包含3个字段'id','origin'和'description',原点可以重复,但每个原点的描述必须是唯一的, 我正在尝试做的是,如果描述具有键“PT”并且是与其原始键相关联的唯一行,那么它不能在结果集中显示, 否则必须与其他(s)描述字段一起显示。
select * from a
where 1 = 1
and case when (select count(*) from a where 1 = 1 group by origin) > 1
then description != 'PT' else 1 = 1 end
例如,我有5个原点O1,O2,O3,O4,O5键。 O1具有关联的两个描述AC和PT,并且O2仅关联一个描述 PT,在这种情况下在结果集中只显示两行,它们属于O1键,因为O2只有一个键。
这是我到目前为止所尝试过的,但它不会按我想要的方式工作,所以我想知道你是否可以指明方向来实现这个目标。
我尝试使用sqlfiddle,但不管怎么说,这就是我用来创建和填充表格。
CREATE TABLE A
(`id` int, `origin` varchar(7), `description` varchar(255))
;
INSERT INTO A
(`id`, `origin`, `description`)
VALUES
(1, 'O1', 'AC'),
(2, 'O1', 'PT'),
(3, 'O2', 'PT'),
(3, 'O3', 'MI'),
(3, 'O3', 'PT'),
(3, 'O4', 'EG'),
(3, 'O4', 'PT'),
(3, 'O5', 'PT')
;
答案 0 :(得分:0)
抱歉,我不确定您的意思是否是这样的查询:
select a.*,count(*) as cnt from a
group by a.`origin`
having count(*) > 1;
答案 1 :(得分:0)
我让这个工作:
SELECT A1.id, A1.origin, A1.description
FROM A AS A1 INNER JOIN A AS A2 USING (origin)
GROUP BY A1.id, A1.origin, A1.description
HAVING GROUP_CONCAT(DISTINCT A2.description) != 'PT';
输出:
+------+--------+-------------+
| id | origin | description |
+------+--------+-------------+
| 1 | O1 | AC |
| 2 | O1 | PT |
| 3 | O3 | MI |
| 3 | O3 | PT |
| 3 | O4 | EG |
| 3 | O4 | PT |
+------+--------+-------------+
我认为原产地O2和O5应该被排除在外,因为它们都有' PT'并且只有一行具有该原点。根据你的规则,应该展示其他人。
答案 2 :(得分:0)
如果我理解正确,可以使用简单的嵌入式查询。
您好像在寻找包含原始值且没有PT描述的行?
<强>查询:强>
proguard-android.txt
<强>输出:强>
SELECT *
FROM A
WHERE origin IN (SELECT origin FROM A WHERE description != 'PT')