使用NULL值连接多个表以避免重复

时间:2014-04-29 22:18:57

标签: php mysql sql laravel

我正在构建来自多个表格statuseventstracks的新闻Feed。从这些表中检索的数据应该与我关注的所有用户的用户ID相对应。从表面上看,我觉得这看起来很简单,我可以用几个连接来做到这一点。

每个statuseventstracks表格中的每一行都有唯一的ID,并且它们彼此也是唯一的,这应该会使以后更容易。我使用带有主键的unique_id表在插入之前检索ID。

我的麻烦在于将所有价值重复加在一起。

实施例

如果我有这些数据。     ----------

**Status**

user-id = 1

id = 1

status = Hello Universe!


----------


**Events**

user-id = 1

id = 2

event-name = The Big Bang


----------


**Tracks**

user-id = 1

id = 3

track-name = Boom


----------

假设我关注用户1,我想要检索它。

user-id ---- id ---- status ---- event-name ---- track-name

1            1       Hello       NULL            NULL
                     Universe

1            2       NULL        The Big Bang    NULL

1            3       NULL        NULL            Boom

但实际上我得到的是这样的。

user-id ---- status.id ---- events.id ---- tracks.id ---- status ---- event-name ---- track-name

1            1              2               3             Hello       The Big Bang     Boom
                                                          Universe

该行将重复3次。

我尝试过的大部分查询都会得到一些结论。

SELECT * FROM users
INNER JOIN followers ON users.id = followers.`user-id`
LEFT JOIN status ON followers.`follows-id` = status.`user-id`
LEFT JOIN events ON followers.`follows-id` = events.`user-id`
LEFT JOIN tracks ON followers.`follows-id` = tracks.`user-id`
WHERE users.`id` = 2

我正在使用laravel,所以最终这个查询将被放入Eloquent格式。如果在Eloquent中有一个更简单且不会降低性能的方法,请告诉我。

修改

我不能使用UNION,因为每个表中有不同数量的值。该示例被简化以便于阅读。

1 个答案:

答案 0 :(得分:0)

感谢Frazz指出我可以使用UNIONS。我研究了它们并提出了这个问题。

SELECT stream.*, users.id AS me FROM users    
INNER JOIN followers ON users.id = followers.`user-id`
LEFT JOIN (
    SELECT `id`,`user-id`,`created_at`, `name`, NULL as status
    FROM events
    UNION ALL
    SELECT `id`,`user-id`, `created_at`,NULL AS name, `status`
    FROM status
) AS stream ON stream.`user-id` = `followers`.`follows-id`
WHERE users.id = 2

现在是将它转换为雄辩模型的过程......