2011-09-30 83 views
1

我需要你的帮助来弄清楚如何进行查询。 我的想法是建立一个奖励用户的信用体系。 管理员输入学分的描述(例如,用户订阅了新闻通讯,他发表了至少10条评论......)。 我有3个表:如何检查是否存在关系 - 多对多关系

  • 用户(ID和名称),
  • 奖励(ID和说明),
  • rewards_users(id_reward,id_user)。

根据用户与奖励之间是否存在关系,我将提取一个由用户名和Y或N形成行的摘要html表。

+0

为了澄清,你要拿出一个SQL查询根据你的三张桌子列出用户的所有奖励? – rhololkeolke

+0

我的问题是知道用户什么时候没有奖励。 因此,我想检查,如果关系存在 – Dario

回答

2

使用下面的查询来显示所有的奖励为特定用户

SELECT r.description, CASE WHEN ru.user_id IS NULL THEN 'N' ELSE 'Y' END awarded 
FROM rewards r 
LEFT JOIN rewards_users ru ON r.reward_id=ru.reward_id AND ru.user_id = 1 

,并用它作为一个子查询来获取用户的详细信息太

如:

SELECT u.user_id, u.user_name, ua.award, ua.awarded 
FROM users u, 
    (
    SELECT r.description, CASE WHEN ru.user_id IS NULL THEN 'N' ELSE 'Y' END awarded 
    FROM rewards r 
    LEFT JOIN rewards_users ru ON r.reward_id=ru.reward_id AND ru.user_id = u.user_id 
    ) ua 
WHERE u.userid=1 

注意:未经测试。

+0

这就是我正在寻找!谢谢。 – Dario

+0

我以前从未使用过'CASE'。这正是我所需要的。 – Mike

1

听起来好像是你需要离开你的用户表和rewards_users表之间的连接,然后处理空rewards_id的实例:

select u.id as users_id, 
u.name as users_name, 
case when ur.rewards_id is null then 'N' else 'Y' end as hasRewards 
from users u left join users_rewards ur 
on u.id = ur.users_id;