0

我有三张桌子

  1. user(id,fname,lname)
  2. picture(picid,pic_path,userid)
  3. friends(friend_of,friends_id,status)

我想提前获取id,fname,lname,pic_path所有 图片路径可能为空friends_id的 Thankx。friends_of=1

4

3 回答 3

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.

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

于 2012-05-15T07:15:28.513 回答
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
于 2012-05-15T07:25:55.280 回答
0

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

首先我们编译数据。很明显,我们需要所有三个表中的数据,而且只需要一次。因此,首先我们通过连接所有三个表来构建所有可能的组合。在 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

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

于 2012-05-15T08:06:56.983 回答