我一直在爲一次性項目運行一個小型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贈款的結果,並且具有相同的權限,都運行相同的用戶(根)。這不是C#的問題,因爲如果他在MySQL命令行或Workbench中運行它,情況完全相同。
他還能夠針對數據庫中的任何其他表或視圖成功發出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;
但我的同事,第一查詢返回就好了,而第二個給他無效的表/列/權限錯誤。
無論如何,我們可能會放棄這一點,但我討厭不知道爲什麼某些東西不能工作。
您可以發佈您的'someview'定義是什麼? – 2013-02-28 18:59:06
@AndyRefuerzo:更新了視圖的定義。爲了清楚起見,評級具有產品ID和整數評分1-5,產品具有ID,SKU和名稱。 – 2013-02-28 20:03:33