2

从 MySQL 5.1 更新到 5.5 - 一切都很好。我知道差异和站点接受了升级,除了一个。

但是查询太复杂了,我看不出有什么问题...

以下是 5.1 中的工作

SELECT DISTINCT SQL_CACHE *
FROM Regions
WHERE (region_id IN
         (SELECT SQL_CACHE included_region_id AS region_id
          FROM Contains_areas
          WHERE region_id =
              (SELECT toplevel_region_id AS region_id
               FROM Sites
               WHERE site_url = 'http://www.domainname.com/' LIMIT 1))
       OR (region_id =
             (SELECT toplevel_region_id AS region_id
              FROM Sites
              WHERE site_url = 'http://www.domainname.com/' LIMIT 1))
       AND user_id='1')
ORDER BY region ASC

但在 5.5 中,错误是

“您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,以了解在 'AS region_id FROM Contains_areas WHERE region_id IN ( SELE' 第 26 行附近使用的正确语法”

如果可以在我搜索答案时识别出错误,我将不胜感激,但这个查询超出了我的范围。

提前致谢

4

1 回答 1

3

SQL_CACHEMySQL 5.5.3中SQL_NO_CACHE不再允许在子查询中使用:

甲骨文链接

SQL_CACHE 和 SQL_NO_CACHE 选项影响查询缓存中查询结果的缓存(请参阅第 8.9.3 节,“MySQL 查询缓存”)。SQL_CACHE 告诉 MySQL 将结果存储在查询缓存中,如果它是可缓存的并且 query_cache_type 系统变量的值为 2 或 DEMAND。使用 SQL_NO_CACHE,服务器不使用查询缓存。它既不检查查询缓存以查看结果是否已缓存,也不缓存查询结果。(由于解析器的限制,空格字符必须在 SQL_NO_CACHE 关键字之前和之后;非空格字符(例如换行符)会导致服务器检查查询缓存以查看结果是否已缓存。)

对于视图,如果 SQL_NO_CACHE 出现在查询的任何 SELECT 中,则适用。对于可缓存查询,如果 SQL_CACHE 出现在查询引用的视图的第一个 SELECT 中,则适用。

从 MySQL 5.5.3 开始,这两个选项是互斥的,如果同时指定,则会发生错误。此外,子查询(包括 FROM 子句中的子查询)和联合中的 SELECT 语句(除第一个 SELECT 之外)中不允许使用这些选项。

于 2014-06-20T05:00:46.270 回答