从已经有限的MYSQL查询中获取有限的子查询结果

时间:2019-05-16 23:33:16

标签: mysql sql subquery limit

我知道问题名称有点令人困惑,但是我想做的是(如果可能的话)以下内容:在下面的MYSQL查询中,我可以从前15个人那里获得所有电话号码,我需要的是使用此查询,如果此人的电话号码超过3个,则仅返回前3个。

SELECT distinct(pp.PhoneNumber)
FROM person p
INNER JOIN personPhone pp ON p.personId = pp.personId
WHERE !ISNULL(pp.PhoneNumber)           
GROUP  BY p.PersonId, pp.PhoneNumber 
ORDER BY p.personId ASC LIMIT 0,15;

我尝试在SELECT语句内的distinct上进行子查询,但没有成功

编辑:抱歉,我忘记添加正在使用的MySQL版本,它是5.7.24

3 个答案:

答案 0 :(得分:0)

您没有说您拥有的MySQL版本。如果您拥有MySQL 8.x,则可以执行以下操作:

select *
from (
  select
    personId, PhoneNumber, 
    row_number() over(partition by personId order by PhoneNumber) as rn
  from (
    SELECT distinct p.personId, pp.PhoneNumber
    FROM person p
    INNER JOIN personPhone pp ON p.personId = pp.personId
  ) x
) y
where rn <= 3

答案 1 :(得分:0)

另一种方法是使用GROUP_CONCAT获取每人的所有电话号码,然后使用SUBSTRING_INDEX确保最多只能提取3个。

SELECT p.PersonId ID, SUBSTRING_INDEX(GROUP_CONCAT(DISTINCT(pp.PhoneNumber)), ',', 3) Phone
FROM person p
INNER JOIN personPhone pp ON p.PersonId = pp.PersonId
WHERE pp.PhoneNumber IS NOT NULL        
GROUP  BY p.PersonId
ORDER BY p.PersonId ASC LIMIT 15;

答案 2 :(得分:0)

您的查询未获得前15个人的所有电话号码。它有15个电话号码,可能只供15个人使用。

要限制为15个人,请使用子查询。然后您可以将每人限制为三个数字:

SELECT distinct(pp.PhoneNumber)
FROM (SELECT p.*
      FROM person p
      ORDER BY p.personId
      LIMIT 15
     ) p15 INNER JOIN
     personPhone pp
     ON p.personId = pp.personId
WHERE pp.PhoneNumber IS NOT NULL AND
      pp.PhoneNumber <= COALESCE( (SELECT pp2.PhoneNumber
                                   FROM personPhone pp2 
                                   WHERE pp2.PersonId = pp.PersonId
                                   ORDER BY pp2.PhoneNumber
                                   OFFSET 2 LIMIT 1
                                  ), pp.PhoneNumber)