3

コードに次の行があります

    query = "SELECT id, " \
        "( 3959 * acos( cos( radians(37) ) * cos( radians( %(lat)i ) ) * " \
        "cos( radians( %(lng)i ) - radians(-122) ) + sin( radians(37) ) * " \
        "sin( radians( %(lat)i ) ) ) ) AS `distance` from message where" \
        " `distance` <= %(drange)d" % {'lat': float(lat), 'lng': float(lng), 'drange': int(drange)}
    print query
    messages = db.session.query(Message).from_statement(query).all()

これを使用すると、次のエラーが発生します

OperationalError: (OperationalError) (1054, "Unknown column 'distance' in 'where clause'") 'SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( 0 ) ) * cos( radians( 0 ) - radians(-122) ) + sin( radians(37) ) * sin( radians( 0 ) ) ) ) AS `distance` from message where `distance` <= 50' ()

これを修正する正しい方法は何ですか?

4

2 に答える 2

5

句で名前付き式(distance)を参照することはできませんWHERE(これがすべてのデータベースシステムに一般的に当てはまるかどうかはわかりませんが、少なくともMySQLには当てはまります)。代わりに使用できますHAVING(オプションCを参照)。

オプション:

A.where句で式をもう一度繰り返します。

SELECT id, (long_formula) as distance FROM message WHERE (long_formula) <= ...

B.ネストされたクエリを使用します。

SELECT * FROM 
(SELECT id, (long_formula) AS distance FROM message) inner_query 
WHERE distance <= ...

C.次のHAVING句を使用します(私はSQLを何年も使用していますが、これHAVINGを読むまで気づいていませんでした):

SELECT id, (long_formula) as distance FROM message HAVING distance <= ...
于 2011-06-09T21:12:18.987 に答える
0

質問とは関係ありませんが、 "" "の使用を開始すると、クエリの読みやすさを向上させることができます。たとえば、クエリを次のように変更できます。

query = """
            SELECT id,
            ( 3959 * acos( cos( radians(37) ) * cos( radians( %(lat)i ) ) *  cos( radians( %(lng)i ) - radians(-122) ) +
              sin( radians(37) ) * sin( radians( %(lat)i ) ) ) ) AS distance
            FROM message
            WHERE distance <= %(drange)d
         """ % {'lat': float(lat), 'lng': float(lng), 'drange': int(drange)}

また、私にとっては、エイリアスとして「ASdistance」の代わりに「AS'distance'」を正しく使用することです。つまり、「'」を使用できますか?

于 2011-06-09T21:44:07.817 に答える