MySQL столбец AS с BETWEEN вызывает ошибку - PullRequest
0 голосов
/ 27 июня 2011

У меня есть проблема, когда мне нужно AS столбца в запросе MySQL и выполнить 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

Ответы [ 3 ]

3 голосов
/ 27 июня 2011

Из документации MySQL :

Недопустимо ссылаться на псевдоним столбца в предложении WHERE, потому что значение столбца может еще не быть определено, когда предложение WHERE казнены.

Вам придется либо использовать ID вместо post_id в предложении WHERE, либо использовать предложение 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
3 голосов
/ 27 июня 2011

Стандартный SQL запрещает ссылки на псевдонимы столбцов в предложении WHERE.

Это ограничение наложено, поскольку при оценке предложения WHERE значение столбца может еще не быть определено.(http://dev.mysql.com/doc/refman/5.0/en/problems-with-alias.html)

2 голосов
/ 27 июня 2011

Да, вы можете!

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'
...