我一直在为一次性项目运行一个小小的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;
但对于我的同事,第一个查询返回正常,而第二个查询则给出了无效的表/列/权限错误。
我们可能会废弃这个,但我不想知道为什么有些东西不起作用。
答案 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;