SQL Select 的结果与计数
SQL Result of Select with count
这应该是一个简单的 SQL 查询,但不知何故我确实很费力。不知道为什么...
我有两个表(USERINFO 和 FRIENDS),我想获取所有以 'm' 开头的朋友并检查我是否是那个的朋友。
唯一的问题是,我想检查 USERID 是否在第二个 table 中,但我无法让它工作。尝试使用连接但没有太大帮助...
到目前为止我的代码:
SELECT u.USERID, u.USERNAME, u.USERPIC, f.ISFRIEND FROM
(SELECT * FROM USERINFO WHERE MATCH (USERNAME) AGAINST ('*m*' IN BOOLEAN MODE)) as u,
(SELECT count(*) as ISFRIEND FROM FRIENDS WHERE (User_ID = 2 AND Friend_ID = u.USERID) OR (User_ID = u.USERID AND Friend_ID = 2)) as f
u.USERID应该勾选'dynamically'
-------------------------------------------- ---------------------------------------------- --------
此代码显然可以工作,但我需要检查我之前从select 查询中获得的ID。 ..
SELECT u.USERID, u.USERNAME, u.USERPIC, f.ISFRIEND FROM
(SELECT * FROM USERINFO WHERE MATCH (USERNAME) AGAINST ('*m*' IN BOOLEAN MODE)) as u,
(SELECT count(*) as ISFRIEND FROM FRIENDS WHERE (User_ID = 2 AND Friend_ID = 1) OR (User_ID = 1 AND Friend_ID = 2)) as f
提前致谢:)
马库斯
所以你想知道那个以m开头的人是不是朋友
鉴于您没有提供有关数据结构的详细信息,我们必须得出一个结果(如果适用,将进行调整)。
SELECT
u.USERID, u.USERNAME, u.USERPIC,
case
when exists (SELECT 0 FROM FRIENDS WHERE (User_ID = 1 AND Friend_ID = u.USERID) OR (User_ID = u.USERID AND Friend_ID = 1)) then 1
else 0
end as ISFRIEND
FROM USERINFO u
WHERE MATCH (u.USERNAME) AGAINST ('*m*' IN BOOLEAN MODE)
这在大型系统中性能不佳,因为您总是得到大量以 m* 开头的人,实际上您与
进行比较
*m*
这将为您提供名称中包含 m 的所有用户。这真的是你想要的吗?
我想你需要的是像下面这样的东西。这将 return 所有名称以 m 开头的用户,并加入他们的朋友是传入用户的地方。如果没有加入则表明该用户不是给定用户的朋友。
SELECT
u.USERID,
u.USERNAME,
u.USERPIC,
CASE WHEN f.User_ID IS NULL THEN 0 ELSE 1 END CASE AS ISFRIEND
FROM USERINFO AS u
LEFT OUTER JOIN FRIENDS AS f ON f.User_ID = u.USERID AND f.User_ID = 46))
WHERE MATCH (u.USERNAME) AGAINST ('*m*' IN BOOLEAN MODE)
这应该是一个简单的 SQL 查询,但不知何故我确实很费力。不知道为什么...
我有两个表(USERINFO 和 FRIENDS),我想获取所有以 'm' 开头的朋友并检查我是否是那个的朋友。
唯一的问题是,我想检查 USERID 是否在第二个 table 中,但我无法让它工作。尝试使用连接但没有太大帮助...
到目前为止我的代码:
SELECT u.USERID, u.USERNAME, u.USERPIC, f.ISFRIEND FROM
(SELECT * FROM USERINFO WHERE MATCH (USERNAME) AGAINST ('*m*' IN BOOLEAN MODE)) as u,
(SELECT count(*) as ISFRIEND FROM FRIENDS WHERE (User_ID = 2 AND Friend_ID = u.USERID) OR (User_ID = u.USERID AND Friend_ID = 2)) as f
u.USERID应该勾选'dynamically'
-------------------------------------------- ---------------------------------------------- --------
此代码显然可以工作,但我需要检查我之前从select 查询中获得的ID。 ..
SELECT u.USERID, u.USERNAME, u.USERPIC, f.ISFRIEND FROM
(SELECT * FROM USERINFO WHERE MATCH (USERNAME) AGAINST ('*m*' IN BOOLEAN MODE)) as u,
(SELECT count(*) as ISFRIEND FROM FRIENDS WHERE (User_ID = 2 AND Friend_ID = 1) OR (User_ID = 1 AND Friend_ID = 2)) as f
提前致谢:)
马库斯
所以你想知道那个以m开头的人是不是朋友
鉴于您没有提供有关数据结构的详细信息,我们必须得出一个结果(如果适用,将进行调整)。
SELECT
u.USERID, u.USERNAME, u.USERPIC,
case
when exists (SELECT 0 FROM FRIENDS WHERE (User_ID = 1 AND Friend_ID = u.USERID) OR (User_ID = u.USERID AND Friend_ID = 1)) then 1
else 0
end as ISFRIEND
FROM USERINFO u
WHERE MATCH (u.USERNAME) AGAINST ('*m*' IN BOOLEAN MODE)
这在大型系统中性能不佳,因为您总是得到大量以 m* 开头的人,实际上您与
进行比较*m*
这将为您提供名称中包含 m 的所有用户。这真的是你想要的吗?
我想你需要的是像下面这样的东西。这将 return 所有名称以 m 开头的用户,并加入他们的朋友是传入用户的地方。如果没有加入则表明该用户不是给定用户的朋友。
SELECT
u.USERID,
u.USERNAME,
u.USERPIC,
CASE WHEN f.User_ID IS NULL THEN 0 ELSE 1 END CASE AS ISFRIEND
FROM USERINFO AS u
LEFT OUTER JOIN FRIENDS AS f ON f.User_ID = u.USERID AND f.User_ID = 46))
WHERE MATCH (u.USERNAME) AGAINST ('*m*' IN BOOLEAN MODE)