使用所有工具和CMS,我一直很容易创建应用程序。虽然我第一次使用高级SQL而没有任何ORM,所以我不知道如何获得我正在寻找的结果。
我正在努力建立一个用户友好系统。基本上用户可以添加另一个用户作为朋友,该朋友可以接受。我有两张桌子用户& Users_Relationships。 Users表有明显的用户信息,User_Relationships表有relation_setter(请求者用户的id),relation_getter(请求用户的id)和active
问题是我需要在页面上显示所有朋友(活动或非活动)。我知道以下查询是错误的,但这是我提出的:
$sql = "SELECT *
FROM users_relationships
LEFT JOIN users
ON users_relationships.relation_setter = users.user_id
WHERE users_relationships.relation_getter = " . $logged_in_id.
" OR users_relationships.relation_setter = " . $logged_in_id;
我需要的是关系表中的所有用户作为带有$ logged_in_user的setter或getter。简单地说,我需要所有与我朋友在一起的人,无论是谁添加了他们,我或他们,并根据我每行获得的“活跃”价值,它将打印“请求待处理”或不。
上面的查询给我带来了非常复杂的结果,许多重复项请求待处理也是错误的。
答案 0 :(得分:2)
JOIN
表格Users
再一次这样:
SELECT
us.UserName AS SetterName,
ug.UserName AS GetteerName,
ur.Active AS Status,
...
FROM users_relationships ur
LEFT JOIN users us ON ur.relation_setter = us.user_id
LEFT JOIN users ug ON ur.relation_getter = ug.user_id
WHERE $logged_in_id IN(ur.relation_getter, ur.relation_setter);
为了将朋友列表作为一个列表而不是两个用户的名称,您可以这样做:
SELECT
us.UserName AS FriendName,
ur.Active AS Status
FROM
(
SELECT relation_setter user_id, active
FROM users_relationships
WHERE relation_getter = $logged_in_id
UNION
SELECT relation_getter, active
FROM users_relationships
WHERE relation_setter = $logged_in_id
) AS ur
LEFT JOIN users us ON ur.user_id = us.user_id;
这将为您提供登录用户的朋友姓名列表。
此查询的工作原理?
登录使用的列表是relation_setter
或relation_getter
。因此,为了将这两个列放在一列中,我使用两个查询得到每个查询,一个用于relation_setter
:
SELECT relation_setter user_id, active
FROM users_relationships
WHERE relation_getter = $logged_in_id
另一个用于relation_getter
:
SELECT relation_getter, active
FROM users_relationships
WHERE relation_setter = $logged_in_id
然后我使用 UNION
将它们作为一个结果集:
SELECT relation_setter user_id, active
FROM users_relationships
WHERE relation_getter = $logged_in_id
UNION
SELECT relation_getter, active
FROM users_relationships
WHERE relation_setter = $logged_in_id
此查询会将两个查询中的所有数据仅提供给两个字段user_id
,active
。
请注意:
UNION
隐式选择不同的行,它会消除重复的行,但UNION ALL
会保留这些重复的行。
两个联合的结果集将具有在第一个选择中指定的列的名称;在我们的查询中,第二个选择的第一列的名称为relation_getter
,来自此列的值将位于userid
之下,因为它是在第一个查询中定义的。
然后我在子查询中包含了这两个联合查询,并将其与Users
表连接起来,我们完成了:)
答案 1 :(得分:0)
$sql = "SELECT *
FROM users_relationships rel
LEFT outer JOIN users from ON rel.relation_setter = from.user_id
LEFT outer JOIN users to ON rel.relation_getter = to.user_id
WHERE rel.relation_getter in (" . $logged_in_id. "," . $logged_in_id . ")";