Mysql'deki WHERE yan tümcesinde bir takma ad kullanabilir misiniz?


121

WHERE yan tümcesinde bir takma ad kullanmam gerekiyor, ancak bana bunun bilinmeyen bir sütun olduğunu söylüyor. Bu sorunu aşmanın bir yolu var mı? X'den yüksek derecelendirmeye sahip kayıtları seçmem gerekiyor. Derecelendirme aşağıdaki takma adla hesaplanır:

sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating

Yanıtlar:


229

Sen hangi bir HAVING yan tümcesi kullanabilirsiniz olabilir takma adları, örneğin bkz

 HAVING avg_rating>5

ancak where cümlesinde ifadenizi tekrarlamanız gerekir, örneğin

 WHERE (sum(reviews.rev_rating)/count(reviews.rev_id))>5

FAKAT! Tüm ifadelere izin verilmeyecektir - TOPLA gibi bir toplama işlevinin kullanılması işe yaramaz, bu durumda HAVING yan tümcesi kullanmanız gerekir.

Gönderen MySQL Kılavuzuna :

WHERE yan tümcesinde sütun diğer adına başvurulmasına izin verilmez, çünkü sütun değeri WHERE yan tümcesi yürütüldüğünde henüz belirlenmemiş olabilir. Bkz. Bölüm B.1.5.4, "Sütun Diğer Adlarıyla İlgili Sorunlar" .


1
İfadeyi tekrar edersem, bana şunu söyler: "grup işlevinin geçersiz kullanımı"

3
Daha net toplama işlevlerine izin verilmemesi için yeniden ifade ettiler
Paul Dixon

Özellikle güzel açıklama. "but in a where cümlesi ... tekrarla .." bölümü
th3an0maly

4
Bu iyi bir cevaptır, ancak HAVINGveriler getirildikten ve daha WHEREönce çalıştırıldıktan sonra yürütüldüğü için lütfen performans etkilerini göz önünde bulundurun .
StockB

Bir WHERE yan tümcesinde toplama işlevlerini kullanamazsınız. WHERE yan tümcesi, tüm grupları değil, yalnızca tek tek satırları filtreler.
Bill Karwin

33

Dunno, eğer bu mysql'de çalışıyorsa, ancak sqlserver'ı kullanarak da şu şekilde sarabilirsiniz:

select * from (
  -- your original query
  select .. sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating 
  from ...) Foo
where Foo.avg_rating ...

6

Bu soru oldukça eski ve bir cevap şimdiden 160 oy aldı ...

Yine de şunu açıklığa kavuşturabilirim: Soru aslında cümlecikte takma adların kullanılıp kullanılamayacağıyla ilgili değilWHERE .

sum(reviews.rev_rating) / count(reviews.rev_id) as avg_rating

bir toplamadır. Gelen WHEREfıkra onların değerlerine bakarak tablolardan istediğimiz kayıtları kısıtlar. sum(reviews.rev_rating)vecount(reviews.rev_id) , ancak, bir kayıtta bulduğumuz değerler değildir; bunlar yalnızca kayıtları topladıktan sonra elde ettiğimiz değerlerdir.

Yani WHEREuygunsuz. HAVINGToplamadan sonra sonuç satırlarını kısıtlamak istediğimiz için ihtiyacımız var . Olamaz

WHERE avg_rating > 10

ne de

WHERE sum(reviews.rev_rating) / count(reviews.rev_id) > 10

dolayısıyla.

HAVING sum(reviews.rev_rating) / count(reviews.rev_id) > 10

diğer yandan mümkündür ve SQL standardı ile uyumludur. Buna karşılık

HAVING avg_rating > 10

sadece MySQL'de mümkündür. SELECTCümlenin daha sonra çalıştırılması gerektiğinden , standarda göre geçerli SQL değildir HAVING. MySQL belgelerinden:

Standart SQL için başka bir MySQL uzantısı, HAVING yan tümcesinde seçim listesindeki diğer adlı ifadelere referanslara izin verir.

MySQL uzantısı, toplanan sütun için HAVING yan tümcesinde bir takma adın kullanılmasına izin verir

https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html


0

Sorgunuz statikse, onu bir görünüm olarak tanımlayabilir, ardından görünümü sorgularken bu takma adı where cümlesinde kullanabilirsiniz.


0
SELECT * FROM (SELECT customer_Id AS 'custId', gender, age FROM customer
    WHERE  gender = 'F') AS c
WHERE c.custId = 100;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.