【问题标题】:Mysql join from multiple tablesMysql从多个表连接
【发布时间】:2012-08-28 07:12:57
【问题描述】:

我有 3 张桌子

friends
posts
members

friends
========
id, to, from (user_id's), status

there are 3 status's -1 = denied, 0 = no response/new, 1 = accepted



posts
=======
p_id, user_id (same as member_id), text


members
========
member_id, f_name, l_name

如果想从“posts”中的帖子中选择文本,请将其与“members”中的用户名结合起来,并且只显示 user_id 在“friends”表中的帖子。

我想知道它是否可以完成,我在我的查询中尝试了一个 IN () 语句,但它在 IN () 内生成 csv 时产生了一个新问题。我更喜欢通过 mysql 来做这件事,但如果做不到,我可能会使用全局变量来存储朋友数据(但它不会是最新的,或者当用户结识新朋友时必须刷新)。

【问题讨论】:

  • 好友表中的to, from是什么意思?
  • 当一个新的好友请求被发送时,它会记录发送者和发送者以及请求的状态 -1 = 拒绝,0 = 无响应,1 = 接受。
  • @arennaker friends 的状态部分在上面的模式描述中丢失了,你能补充一下吗?
  • @arennaker 如果 A 和 B 是朋友,是只有一行状态为 1,还是每个方向都有一行? (即仅A B 1 或A B 1 和B A 1)?

标签: mysql join


【解决方案1】:

据我了解,您想查找所有您朋友的姓名和帖子,而不是朋友表中的任何朋友...?

您自己的用户 ID 在 $myId,应该这样做(最新帖子优先);

编辑:为朋友添加状态检查

SELECT m.f_name, m.l_name, p.`text`
FROM members m
JOIN posts p 
  ON m.member_id = p.user_id
JOIN friends f 
  ON f.`to` = m.member_id OR f.`from` = m.member_id
WHERE (f.`from` = $myId OR f.`to`= $myId)
  AND f.`status` = 1 AND m.member_id <> $myId
ORDER BY p.p_id DESC

【讨论】:

  • 这行得通,但它只选择如​​果 f.from = $myID 而不是 f.to = $myID
  • 这很好用,只是结果中不包括成员自己的帖子,有没有办法改变它?
  • @arennaker 你的意思是也包括你自己的帖子?只需删除末尾的AND m.member_id &lt;&gt; $myId。
【解决方案2】:

试试这个:

    SELECT p.text,m.f_name,m.l_name FROM posts p 
    LEFT OUTER JOIN members m ON p.user_id=m.member_id
    where p.user_id in(select id from friends);

OR

   SELECT p.text,m.f_name,m.l_name FROM posts p 
   LEFT OUTER JOIN members m ON p.user_id=m.member_id
   INNER JOIN friends f on p.user_id=f.id

【讨论】:

  • 问题是它只会从朋友列“to”或“from”中选择数据,如果其中一个包含 $member_id,则不会同时选择两者
【解决方案3】:

如果我理解正确,您有一个 user_id,并且您想要由该用户的“朋友”撰写的所有帖子。此查询从帖子开始,将其加入朋友(其中作者是友谊的“目的地”)(此时 WHERE 子句将过滤掉任何非朋友的帖子),然后加入成员以填写作者的姓名信息。

SELECT 
  posts.p_id
  posts.text,
  CONCAT(members.f_name, " ", members.l_name)
FROM 
  posts
  JOIN friends ON posts.user_id = friends.to
  JOIN members ON posts.user_id = members.member_id
WHERE
  friends.from = ?
GROUP BY posts.p_id

【讨论】:

    【解决方案4】:

    我添加了一个子查询来获取你所有的朋友,因为我假设如果你有这些记录

    Friends
    ==================================
    ID      TO       FROM     STATUS
    ==================================
    1       1        2         1
    2       3        1         1
    

    还有你的member_id = 1,你的朋友是2、3对吧?

    SELECT  b.f_name,
            b.L_name,
            c.`text`
    FROM
        (
            SELECT `to` friendID
            FROM    friends
            WHERE   `status` = 1 AND
                    `from` = ?             -- change this to your ID
            UNION
            SELECT `from` friendID
            FROM    friends
            WHERE   `status` = 1 AND
                    `to` = ?               -- change this to your ID
        ) a  INNER JOIN members b
                ON a.friendID = b.member_ID
            LEFT JOIN   posts c
                ON a.friendID = c.user_id
    

    【讨论】:

      猜你喜欢
      • 2015-01-14
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多