Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][SQL]Problem z aliasem utworzonej kolumny
Forum PHP.pl > Forum > Przedszkole
adgad
Witam,
mam problem z zapytaniem w sql-u. Mianowicie wygląda ono tak:
  1. SELECT users.*, SUM(CASE WHEN c.id IS NULL THEN ...END) isComment
  2. FROM (users)
  3. LEFT JOIN comments ON users.id = comments.user_id
  4. WHERE `isComment` = 0
  5. GROUP BY users.id

to przykład zapytania wymyślony na szybko. Problem polega na tym że w zależności czy tworzona kolumna jest 1 czy zero musze ustawić warunek. Robię to w php, na wzór:
  1. if($where['comments']==1)
  2. $this->db->where('isComment >0')
  3. if($where['comments']==0)
  4. $this->db->where('isComment =0')

Problem w tym że mam błąd:
  1. Unknown COLUMN 'isComment' IN 'where clause'

pytanie zatem jak odwołać się do tej kolumny?
Thorang Hoog
Zabrakło informacji o tym, że suma jest aliasem. Dodaj po prostu AS tak jak poniżej.
  1. SUM(CASE WHEN c.id IS NULL THEN ...END) AS isComment
adgad
To nie pomaga. Próbowałem tak zanim napisałem, As z tego co wyczytałem nie jest obowiązkowe.

A może da się to zastąpić klauzulą Having albo innąquestionmark.gif

Problem rozwiązany, rozwiązanie to użycie having, gdyż alias w where nie jest widoczny, może być użyty w having, order by, group by. @Thorang Hoog otrzymujesz pomógł za chęć pomocy jako jedyny smile.gif
mortus
Nie chodzi o to, że brakuje aliasu, bo go nie brakuje. Zapisy `column` `alias` oraz `column` AS `alias` są równoważne.

Nie chodzi również o to, że "alias" w WHERE jest niewidoczny, bo to nie do końca prawda. Alias jest niewidoczny w WHERE ze względu na to, że używasz funkcji agregującej SUM w połączeniu z grupowaniem GROUP BY po kolumnie id, przy czym grupowanie odbywa się na końcu. Zapytanie najpierw szuka wierszy spełniających warunek WHERE `isComment`= 0 (ta kolumna w tej chwili nie istnieje stąd błąd), a dopiero później grupuje wyniki i sumuje wartości (dopiero wtedy "powstaje" kolumna `isComment` i dlatego w WHERE jej "nie widać"). HAVING natomiast działa na pogrupowanych już rekordach.

Poza tym zaleca się w tym przypadku w ramach optymalizacji denormalizację bazy danych i dodanie kolumny przechowującej sumę w danej tabeli.
adgad
Ok, dzięki za wytłumaczenie, ale dopytam.
Cytat(mortus @ 12.04.2013, 08:30:07 ) *
Nie chodzi również o to, że "alias" w WHERE jest niewidoczny, bo to nie do końca prawda. Alias jest niewidoczny w WHERE ze względu na to, że używasz funkcji agregującej SUM w połączeniu z grupowaniem GROUP BY po kolumnie id, przy czym grupowanie odbywa się na końcu. Zapytanie najpierw szuka wierszy spełniających warunek WHERE `isComment`= 0 (ta kolumna w tej chwili nie istnieje stąd błąd), a dopiero później grupuje wyniki i sumuje wartości (dopiero wtedy "powstaje" kolumna `isComment` i dlatego w WHERE jej "nie widać"). HAVING natomiast działa na pogrupowanych już rekordach.

Rozumiem że ta kolumna nie istnieje w momencie wywołania tego przypadku. Mam rozumieć że jeśli zastosuje alias do istniejącej kolumny to on będzie widoczny w warunku where? Bo z tego co wyczytałem to alias(dla pola-kolumny) jest widoczny w having, order by i group by. Taką informację dostałem również na innym forum, dlatego chciałbym to wyjaśnić żeby wiedzieć "co mogę" a co nie w zapytaniu użyć.
Cytat(mortus @ 12.04.2013, 08:30:07 ) *
Poza tym zaleca się w tym przypadku w ramach optymalizacji denormalizację bazy danych i dodanie kolumny przechowującej sumę w danej tabeli.

W przypadku do którego chciałem użyć zapytanie, baza jest rozbudowana, denormalizacja jej będzie czasochłonna.
Thorang Hoog
Wszystkie informacje jakie znalazłem potwierdzają, że w WHERE nie można używać aliasów

  1. mysql> SELECT klijent_id FROM klijenci WHERE klijent_id = 1;
  2. +------------+
  3. | klijent_id |
  4. +------------+
  5. | 1 |
  6. +------------+
  7. 1 row IN SET (0.00 sec)
  8.  
  9. mysql> SELECT klijent_id AS id FROM klijenci WHERE id = 1;
  10. ERROR 1054 (42S22): Unknown COLUMN 'id' IN 'where clause'
  11. mysql>


MySQL 5.5.16
mortus
Fakt, co zresztą wydaję się logiczne... Nie można używać aliasów w WHERE i trzeba użyć nazwy kolumny! Przepraszam za wprowadzanie w błąd... W głowie miałem cały czas takie rozwiązanie:
  1. SELECT * FROM (SELECT `u`.*, SUM(CASE WHEN `c`.`id` IS NULL THEN ... END) `isComment`
  2. FROM `users` `u`
  3. LEFT JOIN `comments` `c` ON `u`.`id` = `c`.`user_id`
  4. GROUP BY `u`.`id`) `t`
  5. WHERE `t`.`isComment` = 0

I stąd nieporozumienie.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.