【问题标题】:How to order sqlite operations如何订购 sqlite 操作
【发布时间】:2018-07-05 12:20:00
【问题描述】:

我在 Python 中使用 sqlite 时遇到了一些问题。我有两个加入的表,table1 和 table2,加入了“id”。以下一系列布尔值出现在我的 WHERE 子句中:

...WHERE (table2.word IN ('grapes', 'cherries') GROUP BY
table1.id HAVING COUNT(*) = 2) AND table1.taste = 'sour';

更具体地说,我正在尝试获取 table2 中同时包含“grapes”和“cherries”作为单词的所有匹配项,但不必使用不同的名称两次加入 table2。这就是为什么我使用 IN,然后使用 GROUP BY 和 HAVING COUNT(*) = 2 来隔离出现次数正好等于我想要匹配的水果数量的情况。

但是,我收到以下错误:

OperationalError: near "group": syntax error

我已将问题与我的括号在第一个布尔值中的工作方式隔离开来,并且已经尝试了几个小时来找出原因。当我取出第二个布尔值“AND table2.taste = 'sour'”时,整个查询工作得很好。我应该转移 GROUP BY 并拥有其他地方吗?

【问题讨论】:

    标签: python mysql sqlite


    【解决方案1】:

    你的查询顺序应该是这样的:

    WHERE
        table1.word IN ('grapes', 'cherries') AND
        table2.taste = 'sour'
    GROUP BY
        table1.id
    HAVING
        COUNT(DISTINCT table1.word) = 2;
    

    WHERE 位于 GROUP BY 之前,而后者又位于 HAVING 之前。这种顺序是有原因的,因为数据库通常会按照您看到它们的顺序来评估每个子句。

    【讨论】:

    • 谢谢!如果我碰巧有两个 IN () 使用实例,我如何确定 GROUP BY 和 HAVING 最终不会影响两个 IN?也就是说,我需要出现 table1.attribute IN (something1, something2) 来考虑 something1 或 something2,但是 table1.word IN ('grapes','cherries') 的出现同时具有葡萄和樱桃跨度>
    • @ilee 检查我更新的HAVING 子句。在 WHERE 子句中限制为仅具有 grapescherries 的记录之后,断言 table1 单词的不同计数为 2。
    猜你喜欢
    • 2018-09-21
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    • 2022-01-09
    • 2021-02-09
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    相关资源
    最近更新 更多