如果我的音乐社区内有更新(歌曲评论,艺术家更新,新歌添加,yadda yadda yadda),我的“更新”表格中会插入一个新行。该行包含艺术家ID以及其他信息(更改类型,时间和日期等)。
我的用户有一个“最喜欢的艺术家”部分,他们可以做到这一点 - 将艺术家标记为他们的最爱。因此,我想创建一个新功能,向用户显示对各种喜爱的艺术家所做的更改。
我应该如何有效地做到这一点?
SELECT *
FROM table_updates
WHERE artist_id = 1
OR artist_id = 500
OR artist_id = 60032
请记住,用户可以将43,000名艺术家标记为收藏。
思想?
答案 0 :(得分:5)
这取决于数据库的设置方式。如果我按照自己的方式行事,我会用这样的表格进行设置:
Table: user_favourite_artist
user_id | artist_id
---------------------
1 | 2
1 | 8
1 | 13
2 | 2
3 | 6
6 | 20
6 | 1
6 | 3
user_id和artist_id一起将是一个复合主键。每行按id指定用户(id)和他们作为收藏夹的艺术家。像这样的查询:
SELECT artist_id FROM user_favourite_artist WHERE user_id = 1
会给你artist_id的2,8和13.这是一个非常简单的查询,可以扩展到你的期望。
相反,当艺术家更新时,您将运行此查询:
SELECT user_id FROM user_favourite_artist WHERE artist_id = 2
你会得到user_id的1和2.这将告诉你哪些用户要通知。此查询也很简单,可以扩展。
答案 1 :(得分:2)
也许你可以试试这个:
SELECT *
FROM table_updates
WHERE artist_id IN(1, 500, 60032)
答案 2 :(得分:1)
如果您在二级表中有标记的艺术家,我建议您使用连接。
像
这样的东西SELECT *
FORM table_updates tu INNER JOIN
table_marked_by_user tmbu ON tu.artist_id = tmbu.artist_id
WHERE tmbu.user_id = $user_id
答案 3 :(得分:0)
如果您使用的是SQL Server,则可以使用嵌套的select语句:
select * from table_updates where artist_id in
(select artist_id from favorites_table where user_id = 10)
如果您不介意进行脏读,可以使用(nolock)加快速度。
select * from table_updates (nolock) where artist_id in
(select artist_id from favorites_table (nolock) where user_id = 10)