2013-02-28 46 views
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贈款的結果,並且具有相同的權限,都運行相同的用戶(根)。這不是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; 

但我的同事,第一查詢返回就好了,而第二個給他無效的表/列/權限錯誤。

無論如何,我們可能會放棄這一點,但我討厭不知道爲什麼某些東西不能工作。

+0

您可以發佈您的'someview'定義是什麼? – 2013-02-28 18:59:06

+0

@AndyRefuerzo:更新了視圖的定義。爲了清楚起見,評級具有產品ID和整數評分1-5,產品具有ID,SKU和名稱。 – 2013-02-28 20:03:33

回答

1

快速搜索產生以下結果:

This documented bug#59005 (5.1.36-5.5.9)發生時,有在結果視圖

雖然this bug#60295 (5.1.57-5.6.3)發生時設置視圖表具有相同的列名NULL

另一方面,this link表明您可能會碰到bug#33000 (5.0-5.6.6)的變體,並且可行的解決方案是運行FLUSH TABLES

另一種解決方案來嘗試可以在這裏找到:Views and Privileges

+0

謝謝,我會在早上給他們一個鏡頭。 – 2013-03-01 05:47:41

+0

我確定結果集中沒有空值,也沒有重複的名稱。這個觀點是剛剛創造出來的,所以值得懷疑它需要被刷新。我猜這是你提到的最後一個,但還沒有得到測試。我說是猜測,因爲我的同事從第二個視圖中刪除了「ORDER BY」子句,現在它可以工作。我猜是因爲他放棄並重新定義了視圖,所以它修復了權限,但我不確定爲什麼當他放棄並在早期從DDL創建它們時不起作用。無論如何,它似乎是固定的,所以感謝鏈接。 – 2013-03-04 19:54:21

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

這並沒有解決在另一臺機器上運行COUNT查詢的神祕性。 – 2013-02-28 20:44:09

相關問題