我正在执行此查询:
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/