我有一个内部确认系统,员工可以"感谢"同事。
表"thank"有两个"用户"关系,一个是用户From 关联的"user_from_id"字段上的一对一关系,另一个是数据透视表上的多对多关系,称为"thank_user"表示用户 To 关联。
我需要查询所有 N 个"谢谢",UserFrom 不在 userTo 关系上,在结果集上独占。换句话说,用户不能在结果中重复,在用户从或用户到关联。
我想出了以下SQL,但我发现它是一个肮脏的黑客。如何将其转换为雄辩查询?
create table tmp as select * from (
select thanks.id, thanks.user_from_id, thank_user.user_id, thanks.created_at from thanks
inner join thank_user on thank_user.thank_id=thanks.id
group by user_from_id)
t
group by user_id;
select * from tmp
where user_from_id not in (select user_id from tmp)
and created_at between '2014-01-01' and '2015-12-31'
order by rand()
limit 10;
谢谢!
在一张桌子上重组整个感谢内容。因为感谢已经是一个透视数据。它通过在您的情况下感谢的操作将用户绑定到另一个用户。
另外,您能否更清楚地了解您想要获得的 SQL 结果?解释为现实世界的结果,例如"我想得到有多少人只感谢一个人",而不是像"我想得到from_id计数为 1 的所有行"。
------------------------
| Table: thanks |
------------------------
| id | from_id | to_id |
------------------------
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 1 | 3 |
| 6 | 2 | 1 |
| 7 | 2 | 2 |
------------------------
用户给予的所有感谢(将*
替换为COUNT(id)
以获得感谢计数):
SELECT * FROM thanks WHERE from_id = {id}
用户所做的所有感谢(将*
替换为COUNT(id)
以获得感谢计数):
SELECT * FROM thanks WHERE to_id = {id}
用户是否感谢其他用户:
SELECT * FROM thanks WHERE from_id = {from_id} AND to_id = {to_id}