MySQL присоединиться к вопросу - я делаю это правильно - PullRequest
0 голосов
/ 22 сентября 2011

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

Схемы:

table: coupons
+----+------+--------------------+---------------+
|  id| owner|     date_expiration| 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|
+----+----------+------+--------------------+------+--------+

Я пытаюсь выбрать все купоны с истекшим сроком действия для данного пользователя. Это правильно?

select *
from coupons
join generatedcoupons on user_id = 233 and coupon_id=coupons.id
where coupons.owner=34 and (curdate()>date(coupons.date_expiration)

Ответы [ 2 ]

1 голос
/ 22 сентября 2011

Несколько вещей:

  1. Ваш SQL содержит ошибку, так как имя столбца - expiration_date, а не date_expiration.

  2. Если владельцем coupon_id 15 является всегда (по определению) владелец 34, то вам не следует повторять столбец владельца в сгенерированной таблице купонов. Это является излишним и потенциально создает ситуацию, в которой две таблицы расходятся во мнениях таким образом, что у вас нет возможности выяснить, какие данные являются правильными.

  3. Вы правильно понимаете часть запроса JOIN и часть запроса WHERE, но вы теряете условие фильтрации (user_id = 123) в части JOIN вместо части WHERE.

  4. Вы пометили свой вопрос как вложенные запросы, но на самом деле вопрос не связан с какими-либо вложенными запросами, а является простым присоединением.

1 голос
/ 22 сентября 2011

Вам необходимо присоединиться к владельцу и идентификатору купона. Затем поместите значения, по которым вы хотите фильтровать, в предложении where.

select *
from coupons c
join generatedcoupons g on c.owner=g.owner and g.coupon_id=c.id
where g.user_id = 233 and c.owner=34 and (curdate()>date(c.expiration_date)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...