【问题标题】:LIKE query not working with WHERE and multiple OR WHERE [closed]LIKE 查询不适用于 WHERE 和多个 OR WHERE [关闭]
【发布时间】:2020-10-05 23:54:16
【问题描述】:

我有WHERE 和多个OR WHERE 和LIKE 的连接语句,下面是我尝试过的,不幸的是,即使LIKE 值无效,它也无法正常工作,例如LIKE %0000% 我确信在给定的类似查询中没有这样的相关数据,但下面的 sql 仍然返回行。非常感谢任何帮助和想法。

SELECT `a`.`id`, `a`.`subcategory_id`, `a`.`ps_id`, `b`.`id` AS `b_id`, `b`.`ps_keyword`, `b`.`created_at`
FROM `buss_subcategory_products_services` `a`
LEFT JOIN `buss_products_services` `b` ON `b`.`id` = `a`.`ps_id`
WHERE `b`.`is_deleted` =0
AND `a`.`subcategory_id` = '11'
OR   (
`a`.`subcategory_id` = '1'
OR `a`.`subcategory_id` = '8'
OR `a`.`subcategory_id` = '5'
OR `a`.`subcategory_id` = '2'
OR `a`.`subcategory_id` = '3'
OR `a`.`subcategory_id` = '9'
OR `a`.`subcategory_id` = '4'
OR `a`.`subcategory_id` = '10'
OR `a`.`subcategory_id` = '6'
OR `a`.`subcategory_id` = '7'
 )
AND  `b`.`ps_keyword` LIKE '%xxxxxxxxxxxxxxxxxxxxxxxxxxxx%' ESCAPE '!'
ORDER BY `b`.`ps_keyword` ASC

【问题讨论】:

  • 不要使用或者,在 (1,8,).. 等中使用 subcategory_id
  • 请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出尽可能少的代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表的代码的 SQL。 How to Ask 暂停总体目标的工作,将代码砍到第一个表达式,没有给出你期望的内容,说出你期望的内容和原因。
  • LEFT JOIN ON 返回 INNER JOIN ON 行 UNION ALL 由 NULL 扩展的不匹配的左表行。作为 OUTER JOIN ON 的一部分,始终知道您想要什么 INNER JOIN ON。在 LEFT JOIN ON 之后,需要右 [sic] 表列不为 NULL 的 WHERE 或 INNER JOIN 删除任何引入了 NULL 的行,即只留下 INNER JOIN ON 行,即“将 OUTER JOIN 转换为 INNER JOIN”。你有那个。这是一个常见问题解答:Left Outer Join doesn't return all rows from my left table?

标签: mysql sql join select where-clause


【解决方案1】:

这看起来像是一个逻辑上的优先级问题。

这个:

WHERE 
    `b`.`is_deleted` =0
    AND `a`.`subcategory_id` = '11'
    OR  (
        `a`.`subcategory_id` = '1'
        OR `a`.`subcategory_id` = '8'
        OR `a`.`subcategory_id` = '5'
        OR `a`.`subcategory_id` = '2'
        OR `a`.`subcategory_id` = '3'
        OR `a`.`subcategory_id` = '9'
        OR `a`.`subcategory_id` = '4'
        OR `a`.`subcategory_id` = '10'
        OR `a`.`subcategory_id` = '6'
        OR `a`.`subcategory_id` = '7'
    )
    AND `b`.`ps_keyword` LIKE '%xxxxxxxxxxxxxxxxxxxxxxxxxxxx%' ESCAPE '!'

应该写成:

WHERE 
    `b`.`is_deleted` =0
    AND (
        `a`.`subcategory_id` = '11'
        OR `a`.`subcategory_id` = '1'
        OR `a`.`subcategory_id` = '8'
        OR `a`.`subcategory_id` = '5'
        OR `a`.`subcategory_id` = '2'
        OR `a`.`subcategory_id` = '3'
        OR `a`.`subcategory_id` = '9'
        OR `a`.`subcategory_id` = '4'
        OR `a`.`subcategory_id` = '10'
        OR `a`.`subcategory_id` = '6'
        OR `a`.`subcategory_id` = '7'
    )
    AND `b`.`ps_keyword` LIKE '%xxxxxxxxxxxxxxxxxxxxxxxxxxxx%' ESCAPE '!'

我建议用IN 替换同一列上的这些多个OR 条件:

WHERE
    `b`.`is_deleted` = 0
    AND `a`.`subcategory_id` IN (11, 1, 8, 5, ..., 7)
    AND `b`.`ps_keyword` LIKE '%xxxxxxxxxxxxxxxxxxxxxxxxxxxx%' ESCAPE '!'

请注意,我将值列表更改为数字而不是字符串 - 这些值看起来像数字,因此它们应该被存储和处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-28
    • 1970-01-01
    相关资源
    最近更新 更多