私は使い捨てプロジェクトのために小さなMySQLデータベースを実行していて、すべてを実行することができた同僚のためにファイルをダンプしました。
C#を使用しており、2つのクエリを実行しています。そのうちの1つは次のことを行います。
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)として実行されています。MySQLコマンドラインまたはWorkbenchで実行した場合もまったく同じことが起こるため、C#の問題ではありません。
また、最初のビューが依存するビューを含め、DB内の他のテーブルまたはビューに対してSELECT COUNT(*)クエリを正常に発行することもできます。これは、彼がSELECT *を実行できるが、SELECT COUNT(*)を実行できない、この1つの特定のビューです。
他の誰かが同じようなことを経験したことがありますか?
サーバーバージョン:5.5.29 MySQL Community Server(GPL)
編集:これは、 Evan Millerの平均評価で並べ替えない方法に基づいて、まだ問題がある関連部分に分解された2つのビュー作成スクリプトです。
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番目のクエリは無効なテーブル/列/権限エラーを返します。
とにかくこれを廃棄するつもりですが、なぜ何かが機能しないのかわからないのは嫌です。