【问题标题】:Eloquent query to not repeat data on an association雄辩的查询不重复关联上的数据
【发布时间】:2015-03-07 15:25:43
【问题描述】:

我有一个内部确认系统,员工可以在其中“感谢”同事。

表“thank”有两个“user”关系,一个在 userFrom 关联的“user_from_id”字段上是一对一的,在一个名为“thank_user”的数据透视表上是多对多的关系。 userTo 关联。

我需要查询所有 N 个 UserFrom 不在 userTo 关系上的“Thanks”,在结果集上独占。换句话说,用户不能在结果中重复,在 userFrom 或 userTo 关联上。

我想出了下面的 SQL,但我发现它是一个肮脏的 hack。如何将其翻译为 Eloquent 查询?

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;

谢谢!

【问题讨论】:

  • 我认为你过于复杂了。为什么不只是一个user_from_iduser_to_id 都是整数的thank 表。您将 from 数据放在单独的表中是否有任何特殊原因?
  • 是的,usersTo 是 1:N 关系,一个用户可以在同一个“感谢”中感谢多个同事,例如。一个团队。
  • 错误:GROUP BY 不指定所有非聚合值可能会导致每列的随机值 - 独立。
  • @zeeto 你的桌子上已经有多个user_to_id。你也可以复制你的user_from_id,没问题。您的 SQL 将更容易编写。我将在几分钟内将其发布为答案。另外,我没有得到您要查询的内容。你能再解释清楚一点吗?

标签: php mysql sql laravel-4 eloquent


【解决方案1】:

在一张桌子上重组整个感谢的东西。因为 thanking 已经是一个数据透视表了。它通过在您的情况下感谢的操作将用户绑定到另一个用户。

另外,您能更清楚地了解您想要获得的 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}

【讨论】:

    猜你喜欢
    • 2014-01-16
    • 2017-02-17
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    • 2016-07-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    相关资源
    最近更新 更多