我的问题中有两个表,一个是USER表,其中包含用户的所有详细信息,另一个是REQUEST表,其中包含所有用户对所有用户的好友请求。我想列出一个登录我的应用程序的用户的所有朋友。

USER表属性是

id | uname   | passwd  | fname | e mail  | dob  | mobileno |  habbits | tastes | profession | image
11 | nagaraj | *****   | naga  | ng@gml  | 3/94 | 998345   | singing  | sports | teacher
12 | chiraag | ******* | chiru | ch@gml  | 2/93 | 894617   | writing  | music  | student


同样,REQUEST表属性是

rqstTO | rqstFM  | fname   | e mail | mobile | status
chirag | nagaraj | nagaraj | ng@gml | 99821  | accepted


表格看起来像这样。现在,我想显示好友的详细信息(来自USER表),仅显示那些已接受登录用户的请求的好友。输出可能是多个用户。要满足的条件是


朋友的所有详细信息(来自用户表)
rqstFM应该是登录的用户,rqstTO必须是他向其发送请求的朋友(因为请求表中包含所有用户的请求详细信息)
status=accepted(他们必须已经接受了请求)


我写的查询是

SELECT *
FROM user
WHERE habits='singing' AND uname = (
    SELECT rqstTO
    FROM request
    WHERE rqstFM ='"+username+"' AND status='Accepted'
);


(这里+username+是从HTML FORM标记获得的登录用户的名称)。我一直收到的错误是“子查询返回多个行”,但我确实需要多行,因为登录的用户可能已将请求发送给许多ppl,并且在所有接受他的请求的人中,需要从用户表中显示其详细信息。请更正我的查询或为我的问题提供适当的查询

最佳答案

您需要使用IN而不是=

您可以按如下所述使用:

SELECT * FROM user
WHERE habits='singing' AND uname IN
( SELECT rqstTO FROM request WHERE rqstFM ='"+username+"' AND status='Accepted');


但是,由于性能问题,不建议使用子查询。您应该使用JOIN重写查询

您可以使用“ JOIN”,如下所示:(我尚未测试过)

SELECT u.* FROM user u
JOIN request r ON u.uname = r.rqstTO
WHERE u.habits='singing' AND r.rqstFM ='"+username+"' AND r.status='Accepted';

07-25 22:51
查看更多