Получить ограниченный результат подзапроса из запроса, который уже ограничен MYSQL - PullRequest
0 голосов
/ 17 мая 2019

Я знаю, что название вопроса несколько сбивает с толку, но я хочу (если это возможно) сделать следующее: В следующем запросе 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 голосов
/ 17 мая 2019

Другой подход - использовать 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;
0 голосов
/ 17 мая 2019

Ваш запрос не получает все номера телефонов первых 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)
0 голосов
/ 17 мая 2019

Вы не говорите, какая у вас версия 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
...