2014-11-22 1 views
0

Почему я получаю Неизвестный столбец «negavote» в «где п»Sql подвыбор считаются где граф равно

SELECT 
    my_users.name, 
    my_users.avatar, 
    my_users.surname, 
    fastmap_projects.*, 
    (SELECT COUNT(*) FROM `fastmap_rating` WHERE `fastmap_rating`.`map_id`=`fastmap_projects`.`id` AND `rate`='1') as `posivote`, 
    (SELECT COUNT(*) FROM `fastmap_rating` WHERE `fastmap_rating`.`map_id`=`fastmap_projects`.`id` AND `rate`='-1') as `negavote` 
FROM (`fastmap_projects`) 
    LEFT JOIN `my_users` ON `fastmap_projects`.`user_id`=`my_users`.`id` 
WHERE 
    `area_id` = '4' 
    AND (`negavote` BETWEEN -3 AND 3) 
    OR (`posivote` BETWEEN -3 AND 3) 

Можете ли вы намекнуть, как я могу изменить это работать?

ответ

1

Это ваш запрос, отформатированный так (по крайней мере) я могу читать:

SELECT my_users.name, my_users.avatar, my_users.surname, fastmap_projects.*, 
     (SELECT COUNT(*) 
     FROM `fastmap_rating` 
     WHERE `fastmap_rating`.`map_id`=`fastmap_projects`.`id` AND `rate`='1') as `posivote`, 
     (SELECT COUNT(*) 
     FROM `fastmap_rating` 
     WHERE `fastmap_rating`.`map_id`=`fastmap_projects`.`id` AND `rate`='-1') as `negavote` 
FROM `fastmap_projects` LEFT JOIN 
    `my_users` 
    ON `fastmap_projects`.`user_id`=`my_users`.`id` 
WHERE `area_id` = '4' AND (`negavote` BETWEEN -3 AND 3) OR (`posivote` BETWEEN -3 AND 3) 

Вы пытаетесь использовать псевдоним столбца в предложении where и SQL не позволяет этого (это часть стандартного, а не ограничения MySQL). Обычным решением является использование подзапроса или CTE. Однако MySQL имеет расширение. Вы можете использовать пункт having вместо пункта where:

SELECT my_users.name, my_users.avatar, my_users.surname, fastmap_projects.*, 
     (SELECT COUNT(*) 
     FROM `fastmap_rating` 
     WHERE `fastmap_rating`.`map_id`=`fastmap_projects`.`id` AND `rate`='1') as `posivote`, 
     (SELECT COUNT(*) 
     FROM `fastmap_rating` 
     WHERE `fastmap_rating`.`map_id`=`fastmap_projects`.`id` AND `rate`='-1') as `negavote` 
FROM `fastmap_projects` LEFT JOIN 
    `my_users` 
    ON `fastmap_projects`.`user_id`=`my_users`.`id` 
HAVING `area_id` = '4' AND (`negavote` BETWEEN -3 AND 3) OR (`posivote` BETWEEN -3 AND 3); 

Как примечание: Просто проверить скобки, чтобы быть уверенным, что это то, что вы хотите сделать. Это выберет области, которые не имеют идентификатора 4. Вы можете это значит:

HAVING `area_id` = '4' AND (`negavote` BETWEEN -3 AND 3 OR `posivote` BETWEEN -3 AND 3); 
+0

Благодарю вас за внимание. Теперь у меня проблема. Вы спасли мой день –

0

Вы не можете использовать псевдонимы столбцов в SQL, где положение (за исключением PostgreSQL, потому что парень гладкая)

или повторить суб-выберите или завернуть запрос в подзапрос и применяйте фильтры по верхнему запросу

SELECT 
    * 
FROM (
    SELECT 
    my_users.NAME, 
    my_users.avatar, 
    my_users.surname, 
    fastmap_projects.*, 
    ( 
     SELECT Count(*) 
     FROM `fastmap_rating` 
     WHERE `fastmap_rating`.`map_id`=`fastmap_projects`.`id` 
     AND `rate`='1' 
    ) AS `posivote`, 
    ( 
     SELECT count(*) 
     FROM `fastmap_rating` 
     WHERE `fastmap_rating`.`map_id`=`fastmap_projects`.`id` 
     AND `rate`='-1' 
    ) AS `negavote` 
    FROM (`fastmap_projects`) 
    LEFT JOIN `my_users` ON `fastmap_projects`.`user_id`=`my_users`.`id` 
) 
WHERE `area_id` = '4' 
AND (`negavote` BETWEEN -3 AND 3) 
OR (`posivote` BETWEEN -3 AND 3) 
+0

спасибо за ваше время –

 Смежные вопросы

  • Нет связанных вопросов^_^