Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][SQL]Problem z aliasem utworzonej kolumny
adgad
post 11.04.2013, 15:32:58
Post #1





Grupa: Zarejestrowani
Postów: 74
Pomógł: 0
Dołączył: 14.04.2010

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
Thorang Hoog
post 11.04.2013, 15:47:50
Post #2





Grupa: Zarejestrowani
Postów: 41
Pomógł: 9
Dołączył: 8.02.2009

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
adgad
post 12.04.2013, 07:01:11
Post #3





Grupa: Zarejestrowani
Postów: 74
Pomógł: 0
Dołączył: 14.04.2010

Ostrzeżenie: (0%)
-----


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

Ten post edytował adgad 11.04.2013, 15:55:29
Go to the top of the page
+Quote Post
mortus
post 12.04.2013, 07:30:07
Post #4





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


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.

Ten post edytował mortus 12.04.2013, 07:32:03
Go to the top of the page
+Quote Post
adgad
post 12.04.2013, 08:52:51
Post #5





Grupa: Zarejestrowani
Postów: 74
Pomógł: 0
Dołączył: 14.04.2010

Ostrzeżenie: (0%)
-----


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.

Ten post edytował adgad 12.04.2013, 09:09:59
Go to the top of the page
+Quote Post
Thorang Hoog
post 12.04.2013, 09:10:09
Post #6





Grupa: Zarejestrowani
Postów: 41
Pomógł: 9
Dołączył: 8.02.2009

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
mortus
post 12.04.2013, 11:08:44
Post #7





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 07:50