2

私は使い捨てプロジェクトのために小さな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番目のクエリは無効なテーブル/列/権限エラーを返します。

とにかくこれを廃棄するつもりですが、なぜ何かが機能しないのかわからないのは嫌です。

4

2 に答える 2

1

クイック検索では、次の結果が得られます。

この文書化されたバグ#59005(5.1.36-5.5.9)NULLは、ビューの結果セットにある場合に発生します

このバグ#60295(5.1.57-5.6.3)は、ビュー内のテーブルの列名が同じ場合に発生します

一方、このリンクは、バグ#33000(5.0-5.6.6)のバリエーションに遭遇している可能性があり、実行可能な解決策は実行することであることを示唆しています。FLUSH TABLES

試す別の解決策はここにあります:ビューと特権

于 2013-03-01T04:30:18.857 に答える
-1
SELECT *, COUNT(*) as `totalcount` FROM ranked_products LIMIT 20 OFFSET 0;
于 2013-02-28T20:41:22.343 に答える