0

次のクエリは、MySQL 5.1.56 で失敗します。

SELECT 
shop_id, products.product_id AS
product_id, brand, title, price, image, image_width, image_height

FROM products, users LEFT JOIN

(
    SELECT fav5.product_id AS product_id, SUM(CASE 
    WHEN fav5.current = 1 AND fav5.closeted = 1 THEN 1
    WHEN fav5.current = 1 AND fav5.closeted = 0 THEN -1
    ELSE 0
    END) AS favorites_count
    FROM favorites fav5
    GROUP BY fav5.product_id 

) AS fav6 ON products.product_id=fav6.product_id
WHERE products.product_id= 46876 AND users.user_id!=products.product_id

エラーは

#1054 - Unknown column 'products.product_id' in 'on clause'

user テーブルを使用しないこの変更は失敗しません。

SELECT 
shop_id, products.product_id AS
product_id, brand, title, price, image, image_width, image_height

FROM products LEFT JOIN

(
    SELECT fav5.product_id AS product_id, SUM(CASE 
    WHEN fav5.current = 1 AND fav5.closeted = 1 THEN 1
    WHEN fav5.current = 1 AND fav5.closeted = 0 THEN -1
    ELSE 0
    END) AS favorites_count
    FROM favorites fav5
    GROUP BY fav5.product_id 

) AS fav6 ON products.product_id=fav6.product_id
WHERE products.product_id= 46876

MySQL 5.0.67 では、どちらのクエリも失敗しません。(データベースを 5.0.67 からエクスポートし、5.1.56 にインポートしたので、構造は同一である必要があります。)

products テーブルには、int(10) 型の product_id カラムがあります。favorites テーブルには、int(10) 型の product_id 列もあります。何が起こっている?

4

3 に答える 3

2

テーブルからの交換と同じくらい簡単です。

FROM users, products LEFT JOIN

注意してください、あなたは結合表記を混ぜています。

于 2012-11-04T20:02:47.513 に答える
1

JOIN処理演算子の優先順位は、5.1のMySQLで変更されました。これは、5.0.12の変更後に5.0 MySQLLEFTJOINからアップグレードする人々に共通の問題です -クエリを書き直す方法

于 2012-11-04T20:06:18.850 に答える
1

これは元のクエリで、少し再フォーマットされ、2つの括弧が追加されています。

SELECT shop_id, products.product_id AS
       product_id, brand, title, price, image, image_width, image_height
  FROM products, 
       (  -- Parenthesis added
       users LEFT JOIN
       (
            SELECT fav5.product_id AS product_id, SUM(CASE 
            WHEN fav5.current = 1 AND fav5.closeted = 1 THEN 1
            WHEN fav5.current = 1 AND fav5.closeted = 0 THEN -1
            ELSE 0
            END) AS favorites_count
            FROM favorites fav5
            GROUP BY fav5.product_id 
        ) AS fav6 ON products.product_id=fav6.product_id
    )  -- Parenthesis added
WHERE products.product_id= 46876 AND users.user_id!=products.product_id

括弧は、SQLパーサーがクエリをどのように解釈しているかを示しproducts、追加された括弧内にテーブルはありません。

古いスタイルと新しいスタイル(SQL-92以降のように)を混合することはお勧めできません。

使用する:

SELECT shop_id, products.product_id AS
       product_id, brand, title, price, image, image_width, image_height
  FROM products JOIN users ON users.user_id != products.product_id
  LEFT JOIN
       (SELECT fav5.product_id AS product_id,
               SUM(CASE WHEN fav5.current = 1 AND fav5.closeted = 1 THEN 1
                        WHEN fav5.current = 1 AND fav5.closeted = 0 THEN -1
                        ELSE 0
                   END) AS favorites_count
          FROM favorites fav5
         GROUP BY fav5.product_id 
       ) AS fav6 ON products.product_id=fav6.product_id
 WHERE products.product_id = 46876

結合は!=遅くなります(実際にはデカルト積です)。

于 2012-11-04T20:12:21.693 に答える