Mysql MariaDB查询使用IN和LIMIT by row

Mysql MariaDB查询使用IN和LIMIT by row,mysql,subquery,mariadb,limit,greatest-n-per-group,Mysql,Subquery,Mariadb,Limit,Greatest N Per Group,在我的一个子查询中尝试使用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 w

在我的一个子查询中尝试使用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;
我看到这里有一个关于同一件事的问题

这个问题有答案,但我无法让它满足我的需要,主要是因为我需要使用联接按行执行,我尝试将同样的方法应用于我的查询,但我不确定如何保持联接工作

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完成的工作示例。它只返回两个父记录,每个父记录只返回两个子记录

请用文字解释所需的结果

同时,看看这是否能满足您的需求:

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
表示“家长”

那么
\u id
\u idno
之间有什么区别呢

在许多父子(层次)关系的实现中,两者都在同一个表中。该表有
主键(id)
和一个名为
parent\u id
的列,然后使用“selfjoin”在父级和子级之间进行连接


如果您为
父项
子项
提供了原始查询的解决方法,则也可能会有所帮助:

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;
保留原始的子查询操作,通过在联接中添加父表来从具有
限制3
的子表中提取
Chu id
。然后执行另一个操作以获取子查询结果,然后将其用于中的

编辑: 我有一个有效的问题,但对此我有复杂的感觉:

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个
Chu id
。因此,这个
子字符串索引(组CONCAT(通过组id ASC分隔符的组id顺序),“”,3)chid
GROUP_CONCAT
水平显示数据,并
SUBSTRING_INDEX
获取程序集中的前3个
ch_id
。通常情况下,group_concat将返回这样的值
1,2,3
和子字符串_索引只能识别第一个、第二个等由[space]('')分隔的值。这就是为什么我添加了分隔符“


然后我在外部查询中使用了两次
SUBSTRING\u INDEX
来定义
f
e
,其中
SUBSTRING\u INDEX(chid,,,1)
获取第一个值,
SUBSTRING\u INDEX(chid,,-1)
从列中获取最后一个值。然后,我将其与原始查询连接起来,并在f和e之间添加了

,这是一个使用PostgreSQL完成的工作示例,我将把它包括在我的问题中,以及一个
LIMIT
没有
ORDER BY
LIMIT可能会导致随机结果。没错,但在这种情况下,顺序并不重要,只是因为它只是一个示例。这很接近,但它只会得到链接到LIMIT 3返回的子行的父行,而不是每个父行的3个子行我的PostgreSQL一个确实如此,这似乎确实有效,但Phewwww。。。看起来很复杂,真的!我仍在试图找到一种更简单的方法,我对MariaDB也是新手:DMe!PostgreSQL将永远是我的bae