【问题标题】:PHP mysql how to relationship three tables showing outputs from different tablesPHP mysql如何关联三个表,显示来自不同表的输出
【发布时间】:2012-05-03 12:01:03
【问题描述】:

我有这张图表

我想做的是有这个输出:

你是怎么做到这个查询的?

我有这个代码

SELECT users.firstname, users.lastname, 
       users.screenname, posts.post_id, posts.user_id,
       posts.post, posts.upload_name, 
       posts.post_type, posts.date_posted
FROM website.users users
INNER JOIN website.posts posts ON (users.user_id = posts.user_id)
ORDER BY posts.pid DESC
//PROBLEM with this one is that it only views the post from all users.

//SO I added
SELECT COUNT(user_id) AS friends, SUM(user_id = ?) AS you, user_id
FROM feeds WHERE post_id = ?
//This one will give you two fields containing how many different users **feeds** the
post

请帮助大家。其实这个我只是关注Facebook的“LIKE”状态 唯一的问题是我不是这类东西的业余爱好者,所以我很高兴听到你所有的答案。我真的需要你的帮助

【问题讨论】:

    标签: php mysql sql facebook


    【解决方案1】:

    如果我对您的理解正确,您需要与feeds 表进行外连接(以保留所有posts,即使没有关联的feeds),然后GROUP BY post.pid 以合并将每个帖子的所有此类提要汇总在一起,并SELECT 所需的信息。

    我使用 MySQL 的 GROUP_CONCAT() 函数获取所有用户的逗号分隔列表(最多 group_concat_max_len) 给定帖子的“提要”(如果需要,您可以使用 SEPARATOR 修饰符更改分隔符)。

    SELECT users.firstname, users.lastname, 
           users.screenname, posts.post_id, posts.user_id,
           posts.post, posts.upload_name, 
           posts.post_type, posts.date_posted,
           COUNT(feeds.user_id) AS friends,   -- number of "likes"
           SUM(feeds.user_id = ?) AS you,     -- did I like this?
           GROUP_CONCAT(feeds.user_id)        -- who likes it?
    FROM website.users users
    INNER JOIN website.posts posts ON (users.user_id = posts.user_id)
    LEFT  JOIN website.feeds feeds ON (posts.post_id = feeds.post_id)
    GROUP BY posts.pid
    ORDER BY posts.pid DESC
    

    更新

    要获取“赞”过帖子的用户全名,不包括自己,需要第二次加入users表:

    SELECT users.firstname, users.lastname, 
           users.screenname, posts.post_id, posts.user_id,
           posts.post, posts.upload_name, 
           posts.post_type, posts.date_posted,
           COUNT(feeds.user_id) AS friends,                      -- number of "likes"
           SUM(feeds.user_id = ?) AS you,                        -- did I like this?
           GROUP_CONCAT(
             CASE WHEN NOT likes.user_id = ? THEN                -- exclude self
               CONCAT_WS(' ', likes.firstname, likes.lastname)   -- full names
             END
           )
    FROM website.users users
    INNER JOIN website.posts posts ON (users.user_id = posts.user_id)
    LEFT  JOIN website.feeds feeds ON (posts.post_id = feeds.post_id)
    LEFT  JOIN website.users likes ON (feeds.user_id = likes.user_id)
    GROUP BY posts.pid
    ORDER BY posts.pid DESC
    

    【讨论】:

    • 非常感谢伙计!但是兄弟,关于这一行“SUM(user_id = ?)就像你一样,我喜欢这个吗?GROUP_CONCAT(user_id)”应该是“feeds.user_id”吗?我有一个错误说:“字段列表中的列 user_id 不明确
    • 是的,抱歉:feeds.user_id。已更新。
    • 非常感谢大家的帮助!
    • 嗯,伙计!我在这里遇到了一个小问题,您如何选择/替换字段“GROUP_CONCAT(feeds.user_id)作为名称” - 从 user_id 输出到名称,不包括喜欢/提供帖子的“你”? @eggyal
    • @PeterWateber: GROUP_CONCAT(NULLIF(feeds.user_id, ?)) 其中? 是“我的”ID。请记住,COUNT 也包括自己(除非您在其参数周围添加类似的 NULLIF)。
    【解决方案2】:

    如果您想为所有用户执行此操作并同时获取提要,则必须加入此feed 表:

    SELECT u.firstname, u.lastname, 
       u.screenname, p.post_id, p.user_id,
       p.post, p.upload_name, 
       p.post_type, p.date_posted,
       COUNT(f.user_id) AS friends, SUM(f.user_id = ?) AS you
    FROM website.users u
    INNER JOIN website.posts p ON (u.user_id = p.user_id)
    LEFT  JOIN website.feeds f ON (p.post_id = f.post_id)
    GROUP BY p.pid
    ORDER BY p.pid DESC
    

    这个应该可以解决问题...

    【讨论】:

    • 谢谢伙计!试图理解一切
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-27
    • 2012-04-04
    • 2014-10-15
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多