我正在构建来自多个表格status
,events
和tracks
的新闻Feed。从这些表中检索的数据应该与我关注的所有用户的用户ID相对应。从表面上看,我觉得这看起来很简单,我可以用几个连接来做到这一点。
每个status
,events
和tracks
表格中的每一行都有唯一的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,因为每个表中有不同数量的值。该示例被简化以便于阅读。
答案 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
现在是将它转换为雄辩模型的过程......