คุณสามารถใช้นามแฝงใน WHERE clause ใน mysql ได้หรือไม่?


121

ฉันจำเป็นต้องใช้นามแฝงในคำสั่ง WHERE แต่มันยังคงบอกฉันว่ามันเป็นคอลัมน์ที่ไม่รู้จัก มีวิธีใดในการแก้ไขปัญหานี้หรือไม่? ฉันต้องการเลือกระเบียนที่มีคะแนนสูงกว่า x การจัดอันดับคำนวณจากนามแฝงต่อไปนี้:

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

คำตอบ:


229

คุณสามารถใช้ HAVING clause ซึ่งสามารถดูนามแฝงได้เช่น

 HAVING avg_rating>5

แต่ในประโยคที่คุณจะต้องทำซ้ำนิพจน์ของคุณเช่น

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

แต่! ไม่อนุญาตให้ใช้นิพจน์ทั้งหมด - การใช้ฟังก์ชันการรวมเช่น SUM จะไม่ทำงานในกรณีนี้คุณจะต้องใช้ HAVING clause

จากคู่มือ MySQL :

ไม่อนุญาตให้อ้างถึงนามแฝงคอลัมน์ในส่วนคำสั่ง WHERE เนื่องจากค่าคอลัมน์อาจยังไม่ถูกกำหนดเมื่อเรียกใช้คำสั่ง WHERE โปรดดูมาตรา B.1.5.4“มีปัญหากับคอลัมน์นามแฝง”


1
ถ้าฉันพูดซ้ำนิพจน์จะบอกฉันว่า: "ใช้ฟังก์ชันกลุ่มไม่ถูกต้อง"

3
ได้กล่าวใหม่เพื่อให้ชัดเจนยิ่งขึ้นไม่อนุญาตให้ใช้ฟังก์ชันการรวมตัว
Paul Dixon

คำอธิบายที่ดีโดยเฉพาะ the "but in a where clause ... repeat .. " part
th3an0maly

4
นี่เป็นคำตอบที่ดี แต่โปรดพิจารณาผลกระทบของประสิทธิภาพเนื่องจากHAVINGดำเนินการหลังจากดึงข้อมูลและWHEREดำเนินการมาก่อน
StockB

คุณไม่สามารถใช้ฟังก์ชันการรวมในส่วนคำสั่ง WHERE คำสั่ง WHERE กรองเฉพาะแถวทีละแถวไม่ใช่ทั้งกลุ่ม
Bill Karwin

33

Dunno หากใช้งานได้ใน mysql แต่ใช้ sqlserver คุณสามารถห่อมันได้เช่น:

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

6

คำถามนี้ค่อนข้างเก่าและหนึ่งคำตอบได้รับ 160 คะแนน ...

ฉันจะอธิบายให้ชัดเจน: คำถามนี้ไม่ได้เกี่ยวกับว่าสามารถใช้ชื่อนามแฝงในWHEREประโยคได้หรือไม่

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

เป็นการรวมตัว ในWHEREประโยคเรา จำกัด ระเบียนที่เราต้องการจากตารางโดยดูที่ค่าของพวกเขา sum(reviews.rev_rating)และcount(reviews.rev_id)อย่างไรก็ตามไม่ใช่ค่าที่เราพบในบันทึก เป็นค่าที่เราได้รับหลังจากการรวมระเบียนเท่านั้น

ดังนั้นจึงWHEREไม่เหมาะสม เราต้องการHAVINGเนื่องจากเราต้องการ จำกัด แถวผลลัพธ์หลังจากการรวม มันไม่สามารถ

WHERE avg_rating > 10

ไม่

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

ด้วยเหตุนี้

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

ในทางกลับกันเป็นไปได้และสอดคล้องกับมาตรฐาน SQL แต่ทว่า

HAVING avg_rating > 10

เป็นไปได้เฉพาะใน MySQL ไม่ใช่ SQL ที่ถูกต้องตามมาตรฐานเนื่องจากSELECTประโยคควรได้รับการดำเนินการหลังจากHAVINGนั้น จากเอกสาร MySQL:

ส่วนขยาย MySQL อื่นเป็น SQL มาตรฐานอนุญาตให้มีการอ้างอิงในส่วนคำสั่ง HAVING กับนิพจน์นามแฝงในรายการที่เลือก

ส่วนขยาย MySQL อนุญาตให้ใช้นามแฝงใน HAVING clause สำหรับคอลัมน์รวม

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


0

หากแบบสอบถามของคุณเป็นแบบคงที่คุณสามารถกำหนดเป็นมุมมองจากนั้นคุณสามารถใช้นามแฝงนั้นในส่วนคำสั่ง where ในขณะที่ค้นหามุมมอง


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.