两个SELECT / WHERE子句组合在一起?

时间:2012-12-10 17:32:10

标签: php mysql database join

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

我简单的数据库结构:

FRIENDS TABLE - relationship_id, friend1_ID, friend2_ID, status

ACTIVE_USERS TABLE - 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,然后在第二个语句中使用该变量来获取关系。或者是否有一种我没有遇到的更简单的语法?感谢帮助!

2 个答案:

答案 0 :(得分: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的别名,我们只需使用选择b.*选择属于该表的字段,而不是覆盖所有内容的默认*你加入的表格,这就是为什么它从两个联合表中返回所有字段的原因。

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

答案 1 :(得分: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
)

(修改了尼尔森的代码)
Probably the optimizer would produce the same,但不知何故,我发现在JOIN中定义关系更合乎逻辑。