我知道问题名称有点令人困惑,但是我想做的是(如果可能的话)以下内容:在下面的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
答案 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)