Не работает WHERE, не видит ALIAS столбец

Тема в разделе "Базы данных", создана пользователем tartas, 8 фев 2013.

Модераторы: latteo
  1. tartas

    tartas

    Регистр.:
    5 сен 2010
    Сообщения:
    294
    Симпатии:
    29
    Всем привет.

    Все просто до банальности :
    SELECT *,(SELECT count(*) FROM table1 WHERE city=cities.id) as 'c1' FROM cities WHERE c1=100 order by c1 desc LIMIT 10

    Оператор WHERE c1=100 не хочет видеть новосозданный столбик с1. По остальным столбикам условие выполняется, без where все работает.

    Помогите понять ошибку!
     
  2. ВладимирТрой

    ВладимирТрой Постоялец

    Регистр.:
    29 янв 2013
    Сообщения:
    53
    Симпатии:
    19
    дело в том что c1 формируется непосредственно в выборке и по нему where в принципе делать неправильно, здесь надо делать having в конце с таким же условием

    Код:
    SELECT *,(SELECT count(*) FROM table1 WHERE city=cities.id) as 'c1' FROM cities having c1=100 order by c1 desc LIMIT 10 
     
    tartas нравится это.
  3. unknown34

    unknown34 Создатель

    Регистр.:
    8 сен 2008
    Сообщения:
    19
    Симпатии:
    2
    здесь лучше обойтись без подзапросов, они тормозят из-за того, что не используются индексы.
    SELECT c.id, c.field1, c.field2, COUNT(c.id) as count
    FROM cities c
    LEFT JOIN table1 t1 ON t1.city=c.id
    GROUP BY t.id
    HAVING count>100

    также не желательно писать * в запросах, я давно уже себя приучил перечислять поля которые мне нужны. так, если таблица будет расти, вы не будете все время вытягивать поля, которые вам могут не понадобится. это экономия времени и семантичность кода.
     
  4. Андрей Шпак

    Андрей Шпак Создатель

    Регистр.:
    11 фев 2013
    Сообщения:
    43
    Симпатии:
    7
    Ну хотелось же человеку использовать вложенный селект! За что вы его так? Тем более, что скорее там объемы и не позволят отследить разницу по быстродействию. К тому же иногда могут и быстреее оказаться - не в этом случае, конечно