2011-09-21 5 views
1

안녕하세요 저는 하나의 테이블 ("쿠폰")을 사용하여 생성 할 수있는 사용 가능한 쿠폰의 각 유형에 대한 정보를 저장하고 다른 테이블 (generatedcoupons)을 저장하는 쿠폰 시스템 생성 된 각 쿠폰에 대한 정보. 각 테이블의 정보를 비교하는 데 어려움을 겪고 있습니다.중첩 된 쿼리에 하나의 값을 전달하는 중첩 쿼리 mysql

스키마 :

table: coupons 
+----+------+--------------------+---------------+ 
| id| owner|  expiration_date| limit_per_user| 
| 15| 34| 2011-09-18 00:00:00|    2| 
+----+------+--------------------+---------------+ 

table: generatedcoupons 
+----+----------+------+--------------------+------+--------+ 
| id| coupon_id| owner|    date| used| user_id| 
| 1|  15| 34| 2011-09-17 00:00:00| false|  233| 
+----+----------+------+--------------------+------+--------+ 

나는 사용자 (즉, 모든 쿼리가 where user_id='$userid'있을 것이다의 관점에서 쿠폰을 표시하는 쿼리를 실행하기 위해 노력하고있어 나는 모두를 표시하는 방법을 알아낼 수 없습니다. limit_per_user이 충족되지 않은 쿠폰 ... 여기에 내가 작동하지 않는있어 무엇 :

는 MySQL의 경우, 결합은 일반적으로보다 빠르고 신뢰할 수있는 서브 쿼리보다
select * 
from coupons 
where owner=34 
and (count(SELECT * from generatedcoupons where user_id=233 and coupon_id=coupons.id)<limit_per_user) 

답변

1

,하지만 당신은 약간 어렵게 생각하게 이 경우에는 조인 한 ro의 수에 따라 제한해야합니다. ws, 그룹화 후 계산이 필요합니다.

select coupons.* 
from coupons 
left join generatedcoupons on user_id = 233 and coupon_id = coupons.id 
where coupons.owner = 34 
group by coupons.id 
having count(generatedcoupons.id) < limit_per_user 
1
select * 
from coupons as c left join 
generatedcoupons as g on g.user_id = 233 and g.coupon_id = c.id 
where c.owner=34 
group by c.id 
having count(g.id) < c.limit_per_user 
: 다행히도, 즉 HAVING 절가 무엇인지 정확하게이다