2017-06-16 52 views
0

我试图通过计算朋友表中发生的事件来检索我拥有超过1个朋友的客户的姓名。那个只显示friend_id和cust_id以及location_id的朋友表,我还必须提及,我有一个位置表,其中包含有关位置的所有详细信息。但不幸的是我有顶部提到的操作数问题; 有人可以向我解释清楚我必须做什么,为什么我的查询是错误的。我已经看过类似的东西,但没有得到它背后的逻辑。请不要提及其他答案,如果您认为这个问题太基本,请不要评论;'操作数'中的子查询应包含1列

select* from customer 
where custid in (select custid, count(custid) as occ from friend group by 
custid having occ >=2); 

回答

0

正如错误消息中提到,子查询可以有一列Select只列出

使用COUNT聚集在Having条款,而不是别名和删除count(custid)select

SELECT * 
FROM customer 
WHERE custid IN (SELECT custid 
        FROM friend 
        GROUP BY custid 
        HAVING Count(custid) >= 2); 

更好地使用JOIN而不是IN,虽然我不太确定在Mysql的性能

SELECT C.* 
FROM customer C 
     JOIN (SELECT custid, 
        Count(custid) AS occ 
      FROM friend 
      GROUP BY custid 
      HAVING occ >= 2) F 
     ON C.custid = F.custid; 
+0

谢谢,但是,返回所有的客户。我的桌子很小。我看到一个客户符合条件 – Shyryu

+0

@Shyryu - 添加样本数据和预期结果 –

+0

我的不好,有一个客户有3个朋友在同一位置并且它在朋友表上清晰可见。我在寻找那个客户的名字。然而,朋友的桌子只给了我location_id /位置表告诉我该地区的名称。 – Shyryu

0

使用IN子句时,错误在内部查询中有多个列。

如果没有IN子句,这可以更好地完成如下。

SELECT cust_name, cust_surname 
    FROM (SELECT cust_name, cust_surname, COUNT (*) 
      FROM customer x JOIN friend y ON (x.cust_id = y.cust_id) 
     GROUP BY cust_name, cust_surname 
      HAVING COUNT (*) > 1); 
相关问题