能够从表中选择,但不能计算行数

时间:2013-02-28 18:48:52

标签: mysql

我一直在为一次性项目运行一个小小的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(*)查询,包括第一个视图所依赖的视图。这只是一个特殊的视图,他可以SELECT *,但不能SELECT COUNT(*)。

还有其他人经历过类似的事吗?

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

编辑:以下是基于Evan Miller's 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;

但对于我的同事,第一个查询返回正常,而第二个查询则给出了无效的表/列/权限错误。

我们可能会废弃这个,但我不想知道为什么有些东西不起作用。

2 个答案:

答案 0 :(得分:1)

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

当视图

中的结果集中有NULL时,会发生

This documented bug#59005 (5.1.36-5.5.9)

当视图中的表具有相同的列名

时,会发生this bug#60295 (5.1.57-5.6.3)

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

可以在此处找到另一种尝试解决方案:Views and Privileges

答案 1 :(得分:-1)

SELECT *, COUNT(*) as `totalcount` FROM ranked_products LIMIT 20 OFFSET 0;