从3个Mysql表

时间:2015-06-16 13:03:43

标签: mysql

假设我有3个不同的表关系,如下所示

1st is tbl_users(id,gender,name)
2nd is tbl_feeds(id,user_id,feed_value)
3rd is tbl_favs(id,user_id,feed_id)

其中id是每个表的主键。

现在假设我想获取那些Feed应该来的数据,这些数据是由Gender =男性用户上传的,每一行都有一个字段,应该说调用此查询的用户将该特定提要标记为喜欢。

结果的最终数据应该如下: 如果该用户标记了收藏夹,那么调用此查询的人员user_id=2 then is_favourite列应包含1,否则is_favourite应包含0。

user_id feed_id feed_value is_favourite gender 
1        2        xyz         1           M
2        3        abc         0           M
3        4        mno         0           M

我希望你能得到我的问题,我能够根据性别获得提要但问题是我遇到问题,根据每个提要条目的特定用户获得is_favourite标记。

我希望有人之前有这些问题,我肯定会得到这些问题的帮助。

如果有人可以解决我的问题,我会非常感激。

谢谢

2 个答案:

答案 0 :(得分:1)

这样的事情应该有效:

SELECT
  u.id AS user_id.
  fe.id AS feed_id,
  fe.feed_value,
  IFNULL(fa.is_favourite, 0),
  u.gender
FROM
  tbl_users u
JOIN
  tbl_feeds fe ON (fe.user_id = u.id)
LEFT JOIN
  tbl_favs fa ON (
    fa.user_id = u.id
  AND
    fa.feed_id = fe.id
  )

答案 1 :(得分:1)

要链接表格,您需要找到它们之间最常见的链接。此链接为user_id。您需要在JOIN的所有表之间创建关系,以确保每个用户都有数据。

现在我不知道您是否计划确保所有表格都包含user_id的数据。但我会使用INNER JOIN,因为它只显示user_id没有空值的记录。如果其他表可能(并不总是保证),您应该根据可能的表使用LEFT JOIN。

SQLFiddle为例。但是,我建议您根据表格的名称命名您的ID字段,这样就没有混淆了!

要获取isFavorite,我会使用子查询来验证并验证用户是否已将其选为收藏夹。

    SELECT
      u.userid, 
      u.gender,
      f.feedsid,
      f.feedvalue,
      (
        SELECT 
          COUNT(*) 
        FROM 
          tbl_favs a 
        WHERE 
          a.userid = u.userid AND 
          a.feedsid = f.feedsid
      ) as isFavorite
    FROM
      tbl_users u
    INNER JOIN
      tbl_feeds f
    ON
      u.userid = f.userid

~~~~编辑1 ~~~~

在回复您的评论时,我更新了SQLFiddle和查询。根据给出的信息,我认为你现在不需要加入。如果你要进行连接,你会得到意想不到的结果,因为你试图在两个你不想要的表之间建立一个公共链接。相反,你只需要将这些表组合在一起并做一个子查询来确定它是否是用户的最爱。

SQLFiddle

    SELECT
      u.userid,
      f.feedsid,
      u.name,
      u.gender,
      f.feedvalue,
      (
        SELECT 
          COUNT(*) 
        FROM 
          tbl_favs a 
        WHERE 
          a.userid = u.userid AND 
          a.feedsid = f.feedsid
      ) as isFavorite
    FROM
      tbl_users u, 
      tbl_feeds f
    ORDER BY 
      u.userid,
      f.feedsid