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