Mysql вложенный запрос, передавая одно значение во вложенный запрос - PullRequest
1 голос
/ 21 сентября 2011

Привет! У меня есть система купонов, которая использует одну таблицу (называемую «купонами») для хранения информации о каждом типе доступных купонов, которую можно сгенерировать, и другую таблицу (генерируемые купоны) для хранения информации о каждом сгенерированном купоне.Мне трудно сравнивать информацию в каждой таблице.

Схемы:

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 не был достигнут ... вот что у меня получилось, что не работает:

select * 
from coupons 
where owner=34 
and (count(SELECT * from generatedcoupons where user_id=233 and coupon_id=coupons.id)<limit_per_user)

Ответы [ 2 ]

1 голос
/ 22 сентября 2011
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
1 голос
/ 22 сентября 2011

Для MySQL объединение обычно происходит быстрее и надежнее, чем подзапросы, но заставляет задуматься немного сложнее.В этом случае вам необходимо ограничить количество основанных строк, что требует вычисления после группировки;к счастью, именно для этого и применяется предложение HAVING:

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
...