使用OR进行查询,排除SQL中的结果

时间:2019-01-22 15:48:05

标签: 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 /开头的频道,或以OTHERCHANNEL /开头的频道,相反,它总是给我以OTHERCHANNEL /开头的结果。

OR似乎不起作用。

有帮助吗?

2 个答案:

答案 0 :(得分:3)

您的查询应该在做您想要的。如果您缺少行,那么模式可能根本不匹配。

我确实有一些建议:

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;

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

注意:

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

答案 1 :(得分:2)

您没有逃脱第一个条件:

AND (channel LIKE 'ACHANNEL\/%' or channel LIKE 'OTHERCHANNEL\/%')