从3个Mysql表中检索数据

从3个Mysql表中检索数据,mysql,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是每个表的主键 现在假设我想得到这些提要应该来自哪里的数据,这些数据是由性别=男性用户上传的,每行有一个字段,表示调用此查询的用户是否将特定提要标记为收藏夹 因此,最终结果数据应如下所示: 其中,假设调用此查询的用户具有user\u i

假设我有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是每个表的主键

现在假设我想得到这些提要应该来自哪里的数据,这些数据是由性别=男性用户上传的,每行有一个字段,表示调用此查询的用户是否将特定提要标记为收藏夹

因此,最终结果数据应如下所示: 其中,假设调用此查询的用户具有
user\u id=2,则is\u Favorite
列应包含1,如果该用户标记为Favorite,则该特定提要否则
is\u Favorite
应包含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_Favorite标志

我希望有人有这些问题之前,我可以得到帮助,从那些肯定

如果有人能解决我的这个问题,我将不胜感激


谢谢

像这样的方法应该会奏效:

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
  )

为了链接表,您需要找到它们之间最常见的链接。此链接是
user\u id
。您需要使用
JOIN
在所有表之间创建一个关系,以确保每个用户都有数据

现在,我不知道您是否计划确保所有表都有
用户id
的数据。但是我会使用
internaljoin
,因为它只显示
user\u id
的记录,而不显示空值。如果其他表可能(并非总是保证)使用左连接,则应基于可能使用的表使用左连接

下面是一个例子。但是,我建议您根据表的名称适当地命名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~~~~

为了回应您的评论,我更新了SQLFIDLE和查询。根据所提供的信息,我不认为您现在真的需要加入。如果要执行联接,则会得到意外的结果,因为您将尝试在两个不需要的表之间建立公共链接。相反,您只需要将这些表组合在一起,并执行子查询,以从FAV确定它是否是用户的最爱

:


你想在前两个表之间建立一个连接,在第三个表上建立一个左连接。是的,这就是我想做的,但如果你能给出一个查询示例,那就太好了。我尝试了你的查询,但小问题是这样的:假设a、B、C是3个用户,id分别为1、2、3。F1、F2、F3分别是A、B用户上传的3个提要。现在假设用户C标记了fav feed F1,F2,那么如果我用User_id=3查询用户C,那么它应该会得到所有feed,除了F1的isfav,对于那些没有被用户C标记为fav的源,isfav=1和isfav=0。因此所有源都应该出现,但isfav是用户特定的,这取决于用户是否将fav标记为相应的源。@LKTANVI对于延迟表示抱歉。我已经更新了我的答案以回应你的评论。基本上,联接会产生意外的结果,因为您将尝试在公共边界上将两个表链接在一起。如果您想显示用户的所有收藏夹,那么加入是不可能的。你只需要把这两张桌子合并起来。SQLFiddle更新了,查询也更新了。谢谢Chris,只做了一些小改动,就可以正常工作了。
    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