1

我对 MySQL 语句不是很好,所以我正在寻找一些见解。假设用户访问了其他人的页面。这会将用户名作为参数发送到脚本,以检查当前用户和他们正在访问的用户页面是否是朋友。

我的简单数据库结构:

朋友桌——relationship_id, friend1_ID, friend2_ID, status

ACTIVE_USERS 表—— id, username, email……等等。

我当前的SQL语句如下:

SELECT * 
FROM friends
JOIN active_users ON ( active_users.username =  '$username' ) 
WHERE (
    friends.friend_1ID = '$current_user_ID'
    AND friends.friend_2ID = active_users.id
    AND friends.status = 1
)

虽然这很有效,但我觉得它并不优雅。如果两者是朋友则返回一行,但这一行显然是用户信息行和关系行的连接。我只想抓住关系行。将其分为两个陈述是否经济?例如,我将使用用户名查询访问页面的用户 ID,然后在第二条语句中使用该变量来获取关系。或者有没有我没有遇到过的更简单的语法?帮助表示赞赏!

4

2 回答 2

2

您可以执行以下操作:

SELECT b.* 
FROM friends b
JOIN active_users ON ( active_users.username =  '$username' ) 
WHERE (
    b.friend_1ID = '$current_user_ID'
    AND b.friend_2ID = active_users.id
    AND b.status = 1
)

通过使用以b朋友表命名的别名,我们可以使用 select 选择属于该表的字段,而不是使用覆盖所有连接表b.*的默认值,这就是为什么它从两个连接表中返回所有字段的原因。*

因此,我们只是为查询中的表提供了别名,以便只能选择属于该别名表的字段。

于 2012-12-10T17:36:43.993 回答
2

JOIN 是从多个表中获取数据的首选方式。它比进行两个单独的调用要快。

我自己对 MySQL 并不熟悉,但它不应该更像:

SELECT b.* 
FROM friends b
JOIN active_users ON ( b.friend_2ID = active_users.id AND active_users.username =  '$username' ) 
WHERE (
    b.friend_1ID = '$current_user_ID'        
    AND b.status = 1
)

(此处修改了 Nelson 的代码)
可能优化器会产生相同的结果,但不知何故,我发现在 JOIN 中定义关系更合乎逻辑。

于 2012-12-10T17:42:38.867 回答