【问题标题】:MySQL select AND on multiple rows and multiple fieldsMySQL在多行和多个字段上选择AND
【发布时间】:2018-06-11 00:23:40
【问题描述】:

我有一张桌子:

+ --------------------------+---------------------------+--------------+--------+
|           ID              |       SKU_ID              |   DKEY       |  DVAL  |
+ --------------------------+---------------------------+--------------+--------+
| cjamtti7z00aivmv4ffc9ttuw | cjamtti7z00afvmv4ai5i0ffy | Part         | A2030  |
| cjamtti7z00ajvmv4gztx7hq8 | cjamtti7z00afvmv4ai5i0ffy | Description  | Single |
| cjamtti7z00akvmv4zvrvtazj | cjamtti7z00afvmv4ai5i0ffy | Length mm    | 50     |
| cjamtti7z00alvmv4jxnryckh | cjamtti7z00afvmv4ai5i0ffy | Line Dia. mm | 6 - 10 |
+ --------------------------+---------------------------+--------------+--------+

我想创建一个查询来搜索与提供的对象匹配的 SKU: { 'Fixing Hole Depth(mm)': '13 Min - 18 Max', 'Inside Dia. (mm)' : '11', 'Weight (g)' : '3' }

我似乎无法找到一种方法来组合 AND 和 OR 子句来给我想要的结果。

总而言之,我需要符合对象中所有条件的 SKU_ID。

【问题讨论】:

    标签: javascript mysql sql node.js knex.js


    【解决方案1】:

    在基本 SQL 中,可以使用 GROUP BY + COUNT 来实现。

    SELECT SKU_ID
    FROM your_table
    WHERE (DKEY = 'Fixing Hole Depth(mm)' AND DVAL = '13 Min - 18 Max,') OR
        (DKEY = 'Inside Dia. (mm)' AND DVAL = '11,') OR
        (DKEY = 'Weight (g)' AND DVAL = '3')
    GROUP BY SKU_ID
    HAVING count(*) = 3
    

    要求每个 SKU_ID + DKEY 都是唯一的(否则对于相同的 SKU_ID,DKEY = 'Weight(g)' 可能有 3 个值,并且查询将无法按预期工作)

    也许有一些不那么冗长的方式,但它应该依赖于 RDBMS

    【讨论】:

    • 非常感谢! 'HAVING count...' 是我出错的地方。我无法摆脱不符合所有标准的结果。我了解唯一的 sku_id+dkey,就是这样。
    • 顺便说一句,从实际的角度来看,这种方法是错误的。我宁愿建议切换到面向文档的 DBMS 或使用一些外部索引器。
    【解决方案2】:

    您的 where 子句可以轻松地组合 AND 和 OR,如果您将它们正确嵌套在括号 () 中。试试看。

    【讨论】:

    • 谢谢。无论我如何嵌套或组合子句,我都无法获得正确的匹配。 @skyboyer 的回答通过使用“HAVING count...”解决了我的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-19
    • 1970-01-01
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    • 2012-11-28
    • 1970-01-01
    相关资源
    最近更新 更多