Mysql MariaDB查询使用IN和LIMIT by row
在我的一个子查询中尝试使用LIMIT时遇到了一些困难,我遇到了错误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
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