0

このクエリの理由:

SELECT SQL_CALC_FOUND_ROWS,a.*,(SELECT cy.iso_code 
                                FROM ps_address AS addr, ps_country AS cy 
                                WHERE addr.id_customer=a.id_customer 
                                AND addr.id_country=cy.id_country) iso_code
FROM `ps_customer` a                        
WHERE iso_code='IT'                         
ORDER BY a.`id_customer` ASC
LIMIT 0,50

私を返してください:#1054 - Unknown column 'iso_code' in 'where clause'?

4

3 に答える 3

3

のドキュメントSELECTから:

WHERE句の実行時に列の値がまだ決定されていない可能性があるため、句で列の別名を参照することは許可されていませんWHEREセクションC.5.5.4「列エイリアスに関する問題」</a>を参照してください。

句で列のエイリアスを使用することはできませんWHERE。クエリで使用されるテーブルの 1 つに実際に存在する列のみを使用できます。

サブクエリをラップして、その結果がそれ自体で「テーブル」として扱われるようにすることができます。次に、その「テーブル」に基準を適用できます。

于 2013-06-03T11:14:36.090 に答える
0

iso_code 列は、メイン クエリ (ps_customer) の選択リスト内で作成しているサブクエリのコンテキストでのみ使用できる ps_address テーブルから取得されているようです。

それに加えて、サブクエリで iso_code 値をすでに制限しているため、メインクエリでこの WHERE ステートメントは必要ありません。それを削除すると、問題ないはずです。

于 2013-06-03T11:15:52.080 に答える
0

上記の SQL は、実行が次の順序で開始されるため機能しません

FROM
WHERE
GROUP BY
HAVING
SELECT
ORDER BY

そのため、列へのエイリアスは実行の最後の 2 番目のステップとして割り当てられ、WHERE はその前に発生します。したがって、SQL エンジンは iso_code がここにあることを知ることはありません。

お役に立てれば。

于 2013-06-03T11:20:02.187 に答える