在依赖于案例结果的位置添加另一个条件

时间:2016-11-22 18:20:28

标签: mysql

所以我一直在思考如何解决这个问题,但我还不知道。 我有一个表'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')
;

3 个答案:

答案 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')