2

我一直在为一个一次性项目运行一个小型 MySQL 数据库,并将该文件转储给一位同事,他能够让一切运行起来。

我们正在使用 C#,并运行两个查询,其中之一是:

SELECT * FROM someview LIMIT 20 OFFSET 0;

另一个是:

SELECT COUNT(*) FROM someview;

我将使用 SELECT SQL_CALC_FOUND_ROWS * 和 FOUND_ROWS(),但这显然不受 MySQLDataReader 存储过程之外的支持。

无论如何,问题是,这两个查询在我的系统上都可以正常工作。在他身上,第一个工作得很好,但是 SELECT COUNT(*) 语句失败并出现以下错误:

Error Code: 1356. View 'db.someview' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them

我们检查了 SHOW GRANTS 的结果,并且具有相同的权限,都以相同的用户(root)运行。这不是 C# 问题,因为如果他在 MySQL 命令行或 Workbench 中运行它,就会发生完全相同的事情。

他还能够成功地针对数据库中的任何其他表或视图发出 SELECT COUNT(*) 查询,包括第一个视图所依赖的视图。这只是一个特殊的视图,他可以选择 *,但不能选择 COUNT(*)。

有没有其他人经历过类似的事情?

服务器版本:5.5.29 MySQL 社区服务器(GPL)

编辑:这里是两个视图创建脚本,根据Evan Miller 的 How Not To Sort By Average Rating,精简到仍然存在问题的相关部分。

CREATE VIEW
    product_rating_counts
AS
SELECT
    p.id AS productId,
    sum(case when (r.rating = 1) then 1 else 0 end) AS 1_star,
    sum(case when (r.rating = 2) then 1 else 0 end) AS 2_star,
    sum(case when (r.rating = 3) then 1 else 0 end) AS 3_star,
    sum(case when (r.rating = 4) then 1 else 0 end) AS 4_star,
    sum(case when (r.rating = 5) then 1 else 0 end) AS 5_star,
    sum(case when (r.rating < 3) then 1 else 0 end) AS negative_ratings,
    sum(case when (r.rating > 3) then 1 else 0 end) AS positive_ratings,
    sum(case when (r.rating = 3) then 1 else 0 end) AS neutral_ratings
FROM
    product p
INNER JOIN
    review r
ON
    p.id = r.productId
GROUP BY
    p.id;

CREATE VIEW
    ranked_products
AS
SELECT
    p.id AS ID,
    p.SKU AS SKU,
    p.Name AS Name,
    prc.1_star,
    prc.2_star,
    prc.3_star,
    prc.4_star,
    prc.5_star,
    prc.positive_ratings AS Positive,
    prc.negative_ratings AS Negative,
    prc.neutral_ratings AS Neutral,
    ((prc.positive_ratings + 1.9208) / (prc.positive_ratings + prc.negative_ratings) -
               1.96 * SQRT((prc.positive_ratings * prc.negative_ratings) / (prc.positive_ratings + prc.negative_ratings) + 0.9604) /
                      (prc.positive_ratings + prc.negative_ratings)) / (1 + 3.8416 / (prc.positive_ratings + prc.negative_ratings))
    AS ci_lower_bound
FROM
    product p
INNER JOIN
    product_rating_counts prc
ON
    p.id = prc.productId
WHERE
    (prc.positive_ratings + prc.negative_ratings) > 0
ORDER BY
    ci_lower_bound DESC;

所以对我有用的是:

SELECT * FROM ranked_products LIMIT 20 OFFSET 0;
SELECT COUNT(*) FROM ranked_products;

但是对于我的同事来说,第一个查询返回得很好,而第二个给他无效的表/列/权限错误。

无论如何,我们可能会放弃这个,但我讨厌不知道为什么有些东西不起作用。

4

2 回答 2

1

快速搜索会产生以下结果:

NULL当视图中的结果集中存在时,会发生此记录的错误#59005 (5.1.36-5.5.9)

当视图中的表具有相同的列名时会发生此错误#60295 (5.1.57-5.6.3)

另一方面,此链接表明您可能会遇到bug#33000 (5.0-5.6.6)的变体,并且可行的解决方案是运行FLUSH TABLES

可以在这里找到另一个尝试的解决方案:视图和权限

于 2013-03-01T04:30:18.857 回答
-1
SELECT *, COUNT(*) as `totalcount` FROM ranked_products LIMIT 20 OFFSET 0;
于 2013-02-28T20:41:22.343 回答