在这种情况下,什么是适当的查询

时间:2013-05-27 00:05:29

标签: mysql

以下是我的情景:

用户可以在他的个人资料上发布内容,他也可以分享其他用户的帖子。我想在查询中选择他已经完成的每个帖子和共享(使用datetime命令)。我只是找不到适合我的基本MySQL技能的查询。帮我找到我的方式扔这个!欢呼声。

表格

id   user_id     content        datetime
1    100         Loremipsum1    2013-03-04 19:35:02 
2    200         Loremipsum2    2013-03-03 19:30:02 
3    200         Loremipsum3    2013-03-01 19:25:02

表份额

id    user_id     target_id     post_id    datetime
1     100         200           2          2013-02-01 19:25:02
2     100         200           3          2013-02-01 19:24:02
3     200         100           1          2013-01-01 19:25:02

假设我想为我的用户100获取每个结果,所需的结果将是

id   user_id     content        datetime
1    100         Loremipsum1    2013-03-04 19:35:02 
2    200         Loremipsum2    2013-03-03 19:30:02 
3    200         Loremipsum3    2013-03-01 19:25:02

因为用户100共享了用户200的两个帖子。

编辑:有些人认为我想要懒惰并让别人为我做我的工作。所以这就是我目前在查询中的位置。

SELECT *
FROM user_stream
LEFT JOIN user_share
ON user_stream.user_id = user_share.user_id
WHERE user_id = 100

我的问题是我需要从target_id中选择内容,而不是我的user_id。但我不知道target_id值。它也可以是多个值(如果用户共享多个帖子)。

1 个答案:

答案 0 :(得分:2)

不完全确定我了解您要查找的内容,但要获取用户创建或共享的帖子列表,您可以使用UNION来合并结果。像这样:

SELECT *
FROM (
    SELECT id, user_id, datetime, 'P' as type
    FROM post
    UNION 
    SELECT post_id, user_id, datetime, 'S' as type
    FROM share
) t
WHERE user_id = 100
ORDER BY datetime 

该类型告诉您它是帖子还是分享。


编辑:鉴于您的评论,看起来您只想要帖子。试试这个:

SELECT *
FROM post
WHERE id IN (
    SELECT id
    FROM post
    WHERE user_id = 100
    UNION 
    SELECT post_id
    FROM share
    WHERE user_id = 100
)
ORDER BY datetime