【发布时间】:2011-04-24 11:10:33
【问题描述】:
以下是从 Hibernate 生成的查询(除了我用 * 替换了字段列表):
select *
from
resource resource0_,
resourceOrganization resourceor1_
where
resource0_.active=1
and resource0_.published=1
and (
resource0_.resourcePublic=1
or resourceor1_.resource_id=resource0_.id
and resourceor1_.organization_id=2
and (
resourceor1_.resource_id=resource0_.id
and resourceor1_.forever=1
or resourceor1_.resource_id=resource0_.id
and (
current_date between resourceor1_.startDate and resourceor1_.endDate
)
)
)
目前我在 Windows 和 Linux 数据库中都有 200 多条记录,目前对于每条记录,以下情况恰好是正确的: 活跃 = 1 发表 = 1 资源公共 = 1
当我直接在 SQL 客户端中运行它时,这个 SQL 查询会在 Windows 上为我获取所有匹配的记录,但在 Linux 上却没有。我在 Windows 和 Linux 上都有 MySQL 5.1。
如果我应用布尔逻辑,(真和真和(真或其他)),我希望结果为真。在 Windows 上确实如此,但在 Linux 上却是错误的!!!
如果我将查询修改如下,它可以在 Windows 和 Linux 上运行:
select *
from
resource resource0_
where
resource0_.active=1
and resource0_.published=1
and (
resource0_.resourcePublic=1
)
因此,仅存在与 resourceOrganization 相关的条件就会使查询在 Linux 上带来 0 结果,我预计由于它是第一部分为真的“或”条件的第二部分,结果应该为真。
知道为什么 2 个操作系统之间的这种行为差异以及为什么显然应该在 Linux 上工作的东西没有!
提前致谢!
【问题讨论】:
-
您是否 100% 确定这是一个平台问题,而不是其他问题 - 编码、用户权限.....
-
SQL 与平台无关——这很可能是 Windows 与 Linux 上的实例之间的数据差异。获取两者的 mysqldumps,然后将 Windows 转储恢复到 Linux 实例并再次测试——应该像在 Windows 上一样工作。
-
由于您使用的是
current_date(),请检查两个系统上的日期。他们同步吗?另外,检查您的客户。一些客户端不会将 1 和 0 转换为布尔值。 -
请停止使用隐含的连接语法。它容易出错(意外交叉连接)更难维护(这是故意的交叉连接还是错误?现在我需要左连接,我该怎么办,提示不要将隐式和显式混合在一起相同的查询))和非常糟糕的编程技术。看在上帝的份上,它自 1992 年以来也已过时,2010 年没有任何借口使用它。
-
选择 * 也是一种糟糕的技术。它会产生维护问题并浪费资源。由于您有一个连接,因此您至少返回了两列具有相同数据的列,浪费、浪费、浪费。您不应该在生产代码中使用 select *。