sql - 使用 OR 查询排除 SQL 中的结果

标签 sql mariadb

我正在执行此查询:

SELECT SQL_CALC_FOUND_ROWS uniqueid, start
FROM sometable
LEFT JOIN log ON 
    sometable.uniqueid = log.anid AND (log.info='someinfo' or log.info='otherinfo')
WHERE `moreInfo` = 1 AND `type` = 'myType' 
  AND (`channel` LIKE 'ACHANNEL/%' or `channel` LIKE 'OTHERCHANNEL\/%')
  AND `start` > '2019-01-22 00:00:00' AND `start` < '2019-01-22 23:59:59'
GROUP BY uniqueid

但是这部分似乎不起作用:

AND (`channel` LIKE 'ACHANNEL%' or `channel` LIKE 'OTHERCHANNEL%')

我希望它为我提供以 ACHANNEL/开头的所有 channel ,或以 OTHERCHANNEL/开头的 channel ,相反,它始终为我提供以 OTHERCHANNEL/开头的结果。

OR 似乎不起作用。

有什么帮助吗?

最佳答案

您的查询应该执行您想要的操作。如果您缺少行,那么模式可能并不真正匹配。

不过我确实有一些建议:

SELECT SQL_CALC_FOUND_ROWS t.uniqueid, MIN(start) as start
FROM sometable t LEFT JOIN
     log l
     ON t.uniqueid = l.anid AND l.info in ('someinfo', 'otherinfo')
WHERE t.`moreInfo` = 1 AND
      t.`type` = 'myType' AND
      (t.`channel` LIKE 'ACHANNEL/%' or t.`channel` LIKE 'OTHERCHANNEL/%') AND
     t.`start` > '2019-01-22' AND `start` < '2019-01-23'
GROUP BY t.uniqueid;

请注意,我已限定所有列名称,并假设WHERE中的所有列引用均引用sometable而不是log 。否则,LEFT JOIN 将变成 INNER JOIN

注释:

  • 所有列均经过限定,这意味着它们使用表别名。当查询具有多个表引用时,强烈强烈建议使用。
  • 日期算术已得到简化。
  • 使用 IN 简化了与 OR 的多重比较。
  • “裸”start 列已转变为聚合函数。
  • 转义字符\已被删除。不需要任何带有正斜杠的转义字符。

关于sql - 使用 OR 查询排除 SQL 中的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54311866/

相关文章:

mysql - 我无法锁定我的 MySQL 表

sql - 构建 mysql 查询时出现问题(每项最新)

sql - 如何选择数据集的最后 25%

mysql - 如何将json字符串作为存储过程参数进行处理

MySQL 使用 Laravel 5.4 时出现连接过多错误

mysql - 为什么Mysql JOIN查询-完整扫描不使用索引

java - 安装 JDBC 驱动程序以从 Matlab 访问 Mariadb 数据库

MySQL:按特定顺序显示每组的第一个

java - JOOQ - 调用 Record.update() 时出现 DataChangedException?

sql - 从prestosql中的日期列获取星期几?