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

Php 使用空值连接多个表以避免重复,php,mysql,sql,laravel,Php,Mysql,Sql,Laravel,我正在从多个表status、events和tracks构建新闻提要。从这些表中检索到的数据应该对应于我跟踪的所有用户的用户id。从表面上看,我认为这似乎足够简单,我可以通过几个连接来完成 status、events和tracks表中的每一行都有唯一的ID,并且它们之间也是唯一的,这将使以后的工作变得更容易。我在插入之前使用了一个唯一的带有主键的_id表来检索id 我的问题是把所有的东西结合在一起,价值观是重复的 实例 如果我有这些数据。 ---------- **Status** user-i

我正在从多个表
status
events
tracks
构建新闻提要。从这些表中检索到的数据应该对应于我跟踪的所有用户的用户id。从表面上看,我认为这似乎足够简单,我可以通过几个连接来完成

status
events
tracks
表中的每一行都有唯一的ID,并且它们之间也是唯一的,这将使以后的工作变得更容易。我在插入之前使用了一个唯一的带有主键的_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,所以最终这个查询将被转换成雄辩的格式。如果有一种更简单且不会降低性能的方法,请让我知道

编辑
我不能使用并集,因为每个表中有不同数量的值。为了便于阅读,这个例子被简化了

感谢弗拉兹指出我可以使用工会。我对他们进行了研究,提出了这个问题

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

现在是将其转换为雄辩模型的过程…

您需要使用联合,而不是联接。@frazz我尝试过使用联合,但因为每个表中的列数不同,所以无法使用。该示例过于简单,如果需要3行,则可以并且必须使用并集。必须显式定义结果集的列。就在几天前,人们还提出了同样的问题: