mysql错误:"子查询返回多行"但我需要从子查询

时间:2015-05-18 08:10:14

标签: mysql

我的问题中有两个表,一个是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表),只显示已经接受登录用户请求的朋友。输出可能是多个用户。要满足的条件是

  1. 朋友的所有细节(来自用户表)

  2. rqstFM应该是登录的用户,rqstTO必须是他发送请求的朋友(因为请求表中包含所有用户的请求详细信息)

    < / LI>
  3. status=accepted(他们必须已接受请求)
  4. 我写的查询是

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

    (此处+username+是从HTML FORM标签获取的登录人员的uname)。我一直得到的错误是&#34;子查询返回多行&#34; 但是我确实需要多行,因为用户可能已经向许多人发送了请求以及所有接受他的人请求,他们的详细信息需要从用户表中显示。请更正我的查询或为我的问题提供适当的查询

2 个答案:

答案 0 :(得分:2)

您需要使用IN代替=

您可以使用如下所述:

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

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

重写查询

您可以使用&#39;加入&#39;如下所示:(我还没有测试过它)

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';

答案 1 :(得分:0)

你想要这样的东西(不测试它):

protected void linkLogout_Click(object sender, EventArgs e)
{
  Cache["sKey"] = string.Empty;
  Response.Redirect("~/LoginPage.aspx");
}

但是,我可能会对这些表进行一些重新考虑,也许这是个人偏好,但你可能最好还有一个只包含id和用户名的连接表,然后加入另外两个表。一个包含请求,一个包含成员详细信息。