【问题标题】:SQLITE check if id has certain valueSQLITE 检查 id 是否具有特定值
【发布时间】:2018-04-09 11:58:19
【问题描述】:

我有一个这样的 SQLITE 表:

id      key      value
244574  16       999
244574  18       999
244574  54       174
214808  16       662
214808  17       808
214808  33       1
214808  60       2
214809  16       902 
214809  17       1103
214809  33       1
214809  60       2
218965  19       808
218965  21       662
218965  33       1
218965  60       8
218966  19       1103
218966  21       902
218966  33       1
218966  60       8

小提琴:click here

现在我尝试获取键不是 60 或键为 60 且值 = 8 的 ID 列表。当我做一个简单的操作时:

select * from items_attributes where (key != 60) OR (key = 60 AND value = 8);

我得到了 key 不是 60 的那些行。但我只想得到三行作为结果:

id      key           value
244574  [16;18;54]    [999;999;174]
218965  [19;21;33;60] [808;662;1;8]
218966  [19;21;33;60] [1103;902;1;8]

由于我是 SQL 的初学者,所以我只能想到一个使用 concat 的解决方案,但我不知道。也许有人可以在这里帮助我。

提前致谢!

最好的问候, 安德烈亚斯

【问题讨论】:

    标签: sqlite


    【解决方案1】:

    怎么样:

    select 
        id,
        '[' || group_concat(key, ';') || ']',
        '[' || group_concat(value, ';') || ']'
    from items_attributes
    group by id
    having 
        -- no rows with key 60 for this id
        count(case when key = 60 then 1 end) = 0 
    or 
        -- 1 or more rows with key 60 & value 8 for this id
        count(case when key = 60 and value = 8 then 1 end) > 0
    

    【讨论】:

    • 太棒了,这正是我想要的。非常感谢!
    【解决方案2】:

    我不确定您希望如何只获得三行。但是,以下查询:-

    SELECT 
        id, 
        '['||group_concat(key,';')||']' AS key_group, 
        '['||group_concat(value,';')||']' AS value_group
    FROM items_attributes 
    WHERE (key != 60) OR (key = 60 AND value = 8) 
    GROUP BY id;
    

    结果:-

    我现在明白了。这似乎可以满足您的要求:-

    SELECT 
        id, 
        '['||group_concat(key,';')||']' AS key, 
        '['||group_concat(value,';')||']' AS value 
    FROM items_attributes WHERE id NOT IN(
        SELECT id FROM items_attributes WHERE (key = 60 AND value != 8))
    GROUP by id ORDER BY id DESC;
    

    【讨论】:

    • 嗨,迈克,感谢您的回答。这看起来相当不错。但是仍然存在键为 60 且值为 != 8 的 ID。因此不应返回前两行。
    猜你喜欢
    • 2013-03-25
    • 2023-03-03
    • 1970-01-01
    • 2021-12-21
    • 2017-06-23
    • 1970-01-01
    • 2012-11-29
    • 2014-08-02
    • 1970-01-01
    相关资源
    最近更新 更多