Mysql从多个表中获取数据

时间:2012-05-15 07:11:51

标签: mysql database join sql

我有三张桌子

  1. user(id,fname,lname)
  2. picture(picid,pic_path,userid)
  3. friends(friend_of,friends_id,status)
  4. 我想为id,fname,lname,pic_path的所有friends_id抓取friends_of=1 图片路径可能为空 提前谢谢。

3 个答案:

答案 0 :(得分:1)

您正在寻找的是join。特别是,你正在寻找一个JOIN和一个LEFT JOIN。

SELECT 
    user.id, user.fname, user.lname, picture.pic_path 
FROM 
    friends 
    JOIN user 
        ON user.id = friends_id 
    LEFT JOIN picture 
        ON userid = user.id 
WHERE 
    friends.friend_of = 1

只有在picture中最多有1个条目时才会有效。

虽然这可以回答您的直接问题,但我建议您对联接非常熟悉。它们是关系数据库的基本操作之一。 (注意,连接本质上是一种数学关系)

答案 1 :(得分:0)

试试这个

SELECT u.*,p.*,f.*
FROM USER u
LEFT JOIN picture p ON p.user_id = id
INNER JOIN friends f ON f.friends_of = u.id
WHERE f.friends_id = 1

答案 2 :(得分:0)

对于类似的查询,您需要了解并使用实体之间的关系。然后你分两步工作:选择和投影,与在CMP关键字是投影之前SQL语法可能暗示的部分相反。

首先我们编译数据。显然,我们需要来自所有三个表的数据,我们需要一次。因此,首先我们通过连接所有三个表来构建所有可能的组合。在SQL中,这是在FROM部分完成的,即

FROM friends f, picture p, user u

f,p和u是别名,其目的是为了节省我们在下面输入完整表名的效果。

现在我们有了所有可能的组合。让我们选择我们想要的: 我想数据库中的每张图片都属于一个存储在数据库中的用户。所以我的假设是你只想要与用户相关的图片。因此,我们对之前制作的所有组合都有第一个限制!限制源自您数据库中存储的数据的(可能的)含义,并表示为:

u.id = p.userid

(注意:通过将此限制应用于上述组合,我们仅“选择”某些组合。)

然后你已经说了另一个限制作为请求“friends_of = 1”来将这个约束与我们写的组合相关联:

f.friends_of=1

然后我们将您的请求“friends_of = 1”与其他数据合并:

f.friend_of = u.id

此约束仅选择那些是某人朋友的用户。现在我们可以结合这些约束。因为我们希望满足所有约束,所以我们在WHERE语句中对它们进行AND:

WHERE u.id = p.userid AND f.friend_of = u.id AND f.friends_of=1

排序不影响意义(在这种情况下。但让我们重新考虑这些限制: u.id = p.userid:我们需要有关用户的信息以及与该用户关联的图片 f.friend_of = u.id:我们正在寻找有兴趣的用户 f.friends_of = 1:我们正在寻找特定某人的朋友

现在我们将存储在数据库中的数据投影到我们想要的位置。我们需要所有用户数据和图片路径。在SQL中:

SELECT u.*,p.pic_path

现在我们把所有东西放在一起。

SELECT u.*,p.pic_path FROM friends f, picture p, user u WHERE u.id = p.userid AND f.friend_of = u.id AND f.friends_of=1

为了允许没有与之关联的图片的朋友(注意:这与pic_path为NULL非常不同),您需要一个外部联接,这意味着您还需要与空集合的组合。这就是我的MySQL不太好的地方,但我猜你会生成你想要的所有组合(以及更多):

FROM friends f JOIN user u LEFT JOIN picture p ON u.id = p.userid

SELECT u.*,p.pic_path FROM friends f JOIN user u LEFT JOIN picture p WHERE  f.friend_of = u.id AND f.friends_of=1

请注意,通过将其从一般选择移动到数据组合的生成作为关于如何创建组合的规则,已经明确了可能违反的约束。是的,这是一条捷径,而不是遵循选择和投射的想法。