【问题标题】:MySql SELECT with some AND operator带有一些 AND 运算符的 MySql SELECT
【发布时间】:2013-07-06 15:47:45
【问题描述】:

我有这张表,我想得到下面的结果

prod_feat_val Table:

**id**    **prod_id**   **feat_id**      **value**
   1         34             20          touch screen
   2         34             25            stamina
   3         34             27           Android 1.6

   4         12             20             keypad
   5         12             27             android

   6         45             20              touch
   7         45             27             android 4

我想通过搜索特征值(值)来查询返回 prod_id(s)。 示例:搜索具有 android OS 和触摸屏键盘的项目..这意味着返回:

 prod_id
    34
    45

我的查询如下:

SELECT prod_id FROM prod_feat_val 
WHERE 
(feat_id = '27' AND value Like '%android%' ) AND (feat_id = '20' AND value Like '%touch%')
GROUP BY prod_id

我认为我的查询基本上是错误的,知道吗? 如果我用 OR 替换中间的 AND 那么我的结果可能会损坏(返回 34,12,45 ::: 它的坏)...

【问题讨论】:

    标签: mysql search select where


    【解决方案1】:

    你应该使用这样的东西:

    SELECT prod_id
    FROM prod_feat_val 
    WHERE 
      (feat_id = '27' AND value Like '%android%' )
      OR (feat_id = '20' AND value Like '%touch%')
    GROUP BY
      prod_id
    HAVING
      COUNT(DISTINCT feat_id)=2
    

    由于您要查找的功能位于不同的行上,因此您需要使用 OR。

    然后你需要按product_id分组并统计不同特征的数量,它必须是2。

    【讨论】:

    • 谢谢。当我们知道搜索中的 feat_id 计数时它工作得很好(这里:2)....但我认为有更好的方法来解决这个问题!
    • 如果您需要获得具有所有功能的所有产品,您需要知道您正在寻找多少功能并且需要进行计数。如果 (prod_id,feat_id) 是唯一的,您可能会跳过 distinct 子句
    【解决方案2】:

    它必须是 OR,但您拼错了 touch

    您还声明您希望结果为 34、45,但您的查询正在搜索 27 和 20。

    您可以使用 SELECT DISTINCT prod_id 而不是 GROUP BY,但这没什么大不了的。

    【讨论】:

    • 如果我替换 OR 而不是中间 AND,结果更改为 prod_id: 34,12,45
    猜你喜欢
    • 1970-01-01
    • 2014-04-22
    • 2019-07-26
    • 1970-01-01
    • 2011-04-04
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多