MariaDB Запрос с использованием IN с LIMIT по строкам - PullRequest
0 голосов
/ 26 апреля 2019

У меня возникли трудности при попытке использовать LIMIT в одном из моих подзапросов, я столкнулся с ошибкой

MariaDB doesn't yet support 'LIMIT in subquery'

По запросу, аналогичному тому, что я сделал в PostgreSQL, чтобы получить 3 дочерних результата для каждого родителя, у которого есть дочерний элемент

select * from parent
join child on child.ch_pa_id = parent.pa_id
and child.ch_id in (
  select child.ch_id from child
  where child.ch_id = parent.pa_id
  limit 3
)
order by parent.pa_id;

Я видел, что здесь был вопрос относительно того же самого

MySQL - эта версия MySQL еще не поддерживает подзапрос 'LIMIT & IN / ALL / ANY / SOME

На вопрос есть ответ, но я не могу заставить его работать для своих нужд, главным образом потому, что мне нужно сделать это построчно с объединением, я пытался применить то же самое к моему запросу, но я не уверен, как это сделать. поддерживать соединение в рабочем состоянии

select * from parent as p
join (
  select * from child
  where child.ch_pa_idno = p.pa_idno # this line breaks it
  limit 3
) as c on c.ch_pa_id = p.pa_id
order by p.pa_id;

выдает ошибку, что p.pa_idno - это столбец Неизвестно, я уверен, что я идиот, и здесь что-то явно не так

Пример * ** тысяча двадцать-один * тысяча двадцать два Вот рабочий пример, сделанный с PostgreSQL http://sqlfiddle.com/#!17/4ed4d/2. Он возвращает только две родительские записи, и для каждого родителя он возвращает только 2 дочерние записи

Ответы [ 2 ]

1 голос
/ 21 мая 2019

Обходной путь из исходного запроса:

SELECT * FROM parent
JOIN child ON child.ch_pa_id = parent.pa_id
AND child.ch_id IN 
  (SELECT ch_id FROM (
  SELECT child.ch_id FROM child JOIN parent
  WHERE child.ch_id = parent.pa_id
  LIMIT 3) a
)
ORDER BY parent.pa_id;

Сохранение исходной операции подзапроса для извлечения ch_id из дочерней таблицы с помощью LIMIT 3, однако, путем добавления таблицы parent в объединение.Затем выполните другую операцию, чтобы получить результат подзапроса, затем используйте его для вашего IN.

РЕДАКТИРОВАТЬ: У меня есть рабочий запрос, но у меня смешанные чувства по этому поводу:

SELECT * FROM parent 
JOIN child ON parent.pa_id=child.ch_pa_id
LEFT JOIN (
 SELECT ch_pa_id,SUBSTRING_INDEX(chid,' ',1) f,SUBSTRING_INDEX(chid,' ',-1) e 
 FROM (
  SELECT ch_pa_id,
         SUBSTRING_INDEX(GROUP_CONCAT(ch_id ORDER BY ch_id ASC SEPARATOR ' '),' ',3) chid 
         FROM child 
         GROUP BY ch_pa_id) a) b 
 ON child.ch_pa_id=b.ch_pa_id
WHERE child.ch_id 
BETWEEN f AND e;

Честно говоря, я боюсь, что это не будет хорошо работать с большими данными, но я всегда изучаю что-то новое и некоторые из функций, которые я только недавно обнаружил.

Согласно вашей скрипке, я замечаю, что вы берете только первые 3 ch_id для каждого родителя.Следовательно, это SUBSTRING_INDEX(GROUP_CONCAT(ch_id ORDER BY ch_id ASC SEPARATOR ' '),' ',3) chid.GROUP_CONCAT для отображения данных по горизонтали и SUBSTRING_INDEX для получения первых 3 ch_id в сборке.Обычно group_concat возвращает значение как таковое;1,2,3 и substring_index могут идентифицировать только первое, второе и т. Д. Значение, разделенное [пробел] ('').Вот почему я добавил SEPARATOR ' '.

Затем я использую SUBSTRING_INDEX дважды для внешнего запроса, чтобы определить f и e, где SUBSTRING_INDEX(chid,' ',1), чтобы получить первое значение, и SUBSTRING_INDEX(chid,' ',-1), чтобы получитьпоследнее значение из столбца.И с этим я присоединяюсь к исходному запросу и добавляю BETWEEN f and e.

0 голосов
/ 18 мая 2019

Пожалуйста, объясните словами желаемый результат.

Тем временем посмотрите, дает ли это то, что вы хотите:

SELECT p.*
    FROM parent AS p
    JOIN child AS c ON c.ch_pa_idno = p.pa_idno
    ORDER BY p.pa_id
    LIMIT 3

Я смущен pa_;это звучит очень похоже на «родителя», но, по-видимому, ch_ обозначает «родителя».

А в чем разница между _id и _idno?

Во многих реализациях parent-детские (иерархические) отношения, оба находятся в одной таблице.В таблице есть PRIMARY KEY(id) и столбец с именем parent_id. Затем для соединения между родителем и детьми используется «самостоятельное соединение».

Может также помочь, если вы предоставите SHOW CREATE TABLE для parent и child.

...