0

MySQLクエリで列をASし、その列でBETWEENを実行する必要があるという問題があります。問題を説明するために私が思いつくことができる最も単純なバージョンはこれです:

SELECT ID AS post_id FROM wp_posts WHERE (post_id BETWEEN 10 AND 20)

これにより、次のエラーがスローされます。

#1054 - Unknown column 'post_id' in 'where clause'

新しく作成されたpost_id列をBETWEEN演算子に表示する方法はありますか?

アップデート:

これが私の実際のクエリです。ご覧のとおり、少し複雑です。

SELECT wp_postmeta.post_id,
MAX(CASE WHEN wp_postmeta.meta_key='store_lng' THEN wp_postmeta.meta_value END ) AS lng,
MAX(CASE WHEN wp_postmeta.meta_key='store_lat' THEN wp_postmeta.meta_value END ) AS lat
FROM wp_postmeta
LEFT JOIN wp_posts ON (wp_posts.ID=wp_postmeta.post_id) 
WHERE
(lng BETWEEN 150.29793837662 AND 152.1161201948)
AND 
(lat BETWEEN -34.775666623377 AND -32.957484805195) 
AND
wp_posts.post_status='publish'
AND
wp_posts.post_type='store'
GROUP BY wp_postmeta.post_id
4

3 に答える 3

3

標準SQLでは、WHERE句での列エイリアスへの参照は許可されていません。

WHERE句が評価されるときに、列の値がまだ決定されていない可能性があるため、この制限が課せられます。(http://dev.mysql.com/doc/refman/5.0/en/problems-with-alias.html

于 2011-06-27T04:40:09.777 に答える
3

MySQLドキュメントから:

WHERE句の実行時に列の値がまだ決定されていない可能性があるため、WHERE句で列エイリアスを参照することは許可されていません。

ID句の代わりにを使用するかpost_idWHERE句を使用する必要がありますHAVING

例えば:

SELECT ID AS post_id FROM wp_posts WHERE ID BETWEEN 10 AND 20

更新:最新の更新に基づいて、すでに提案されているようにサブクエリを使用することも、前に提案したようにHAVING句を使用することもできます。

例えば:

SELECT    wp_postmeta.post_id,
          MAX(CASE WHEN wp_postmeta.meta_key = 'store_lng' THEN wp_postmeta.meta_value END) AS lng,
          MAX(CASE WHEN wp_postmeta.meta_key = 'store_lat' THEN wp_postmeta.meta_value END) AS lat
FROM      wp_postmeta
LEFT JOIN wp_posts
ON        wp_posts.ID = wp_postmeta.post_id
WHERE     wp_posts.post_status = 'publish' AND
          wp_posts.post_type = 'store'
GROUP BY  wp_postmeta.post_id
HAVING    lng BETWEEN 150.29793837662 AND 152.1161201948 AND 
          lat BETWEEN -34.775666623377 AND -32.957484805195
于 2011-06-27T04:41:18.337 に答える
2

はい、できます!

SELECT post_id
from (select id AS post_id FROM wp_posts) x
WHERE post_id BETWEEN 10 AND 20

質問への変更を含めるように編集されました。これを試してください(mysqlで実行されていませんが、正しくない場合は閉じる必要があります):

SELECT *
FROM (SELECT
  wp_postmeta.post_id,
  MAX(CASE WHEN wp_postmeta.meta_key='store_lng' THEN wp_postmeta.meta_value END ) AS lng,
  MAX(CASE WHEN wp_postmeta.meta_key='store_lat' THEN wp_postmeta.meta_value END ) AS lat 
FROM wp_postmeta
GROUP BY wp_postmeta.post_id
) x
LEFT JOIN wp_posts ON wp_posts.ID = x.post_id
WHERE lng BETWEEN 150.29793837662 AND 152.1161201948
AND lat BETWEEN -34.775666623377 AND -32.957484805195
AND wp_posts.post_status='publish'
AND wp_posts.post_type='store'
于 2011-06-27T04:44:45.007 に答える