2009-08-19 37 views
6

Câu hỏi của tôi là rất tương tự như sau một How to reference a custom field in SQL Tôi có truy vấn sau đây:Sử dụng một lĩnh vực tùy chỉnh trong mệnh đề WHERE của truy vấn SQL

SELECT * , (SELECT COUNT(id) 
FROM cms_store_items 
WHERE speaker = cms_store_items_speakers.id 
) AS count 
FROM cms_store_items_speakers 
LIMIT 0 , 30 

tôi cần phải thêm một mệnh đề WHERE trông giống như WHERE count > 0 nhưng khi tôi làm Tôi nhận được lỗi Unknown column 'count' in 'where clause' là có anyway cho tôi để tham khảo các lĩnh vực tùy chỉnh trong điều khoản where của tôi mà không sao chép logic?

Tôi chỉ có thể đặt logic cho mệnh đề where trong mã của mình nhưng tôi không muốn gửi những gì có thể nhiều hơn sau đó 1000 hàng cho ứng dụng nếu không cần thiết, nó có vẻ như lãng phí tài nguyên.

Trả lời

16

Vâng, để làm điều này đúng theo cách mà bạn đang làm việc đó:

select 
* 
from 
(
    SELECT * , (SELECT COUNT(id) 
    FROM cms_store_items 
    WHERE speaker = cms_store_items_speakers.id 
    ) AS count 
    FROM cms_store_items_speakers 
) a 
where a.count > 0 
LIMIT 0 , 30 

Nó có lẽ sẽ tốt hơn để làm những điều sau đây, mặc dù. Nó làm cho sử dụng tốt các having khoản:

select 
    s.id, 
    s.col1, 
    count(i.speaker) as count 
from 
    cms_store_items_speakers s 
    left join cms_store_items i on 
     s.id = i.speaker 
group by 
    s.id, 
    s.col1 
having 
    count(i.speaker) > 0 
limit 0, 30 
+0

Tùy chọn đầu tiên hoạt động tuyệt vời, có vẻ như trước đây của tôi (nhận xét đã bị xóa do bộ nhớ đệm), cảm ơn giải pháp. – UnkwnTech

+0

thay đổi số (\ *) để đếm (ispeaker) và số đếm (\ *) để đếm (ví dụ), chỉ cần chứng minh mã trong tương lai; nếu cần phải đếm số không phù hợp phát sinh, sau đó chỉ cần thay đổi tham gia bên trong để tham gia trái, tôi sẽ upvote câu trả lời của bạn :) –

+0

@Michael: Tốt bắt! Cảm ơn! – Eric

0

Tôi không chắc chắn 100% về mysql, nhưng một cái gì đó như thế này nên rất có thể:

(SELECT 
    * 
FROM 
(
    SELECT cms_store_items_speakers.*, 
      (SELECT COUNT(id) FROM cms_store_items 
      WHERE speaker = cms_store_items_speakers.id) AS 'count' 
    FROM cms_store_items_speakers) 
    LIMIT 0, 30 
) 
WHERE count > 0; 
+1

Bạn đang hạn chế quá sớm. – Eric

10

Bạn có thể sử dụng HAVING khoản thay vì:

... 
) AS count 
FROM cms_store_items_speakers 
HAVING count > 0 
LIMIT 0 , 30 

HAVING giống như WHERE nhưng có thể hoạt động trên các cột được tính toán. Cảnh báo:HAVING hoạt động bằng cách cắt tỉa kết quả sau khi phần còn lại của truy vấn đã được chạy - nó không thay thế cho mệnh đề WHERE.

Các vấn đề liên quan