![](/img/trans.png)
[英]SQL Select unique values by one column with the latest value by another column
[英]How to select unique values from one column based on a value in another column?
该表的结构是child_id
列中的值可以重复, 但每个重复项具有不同的关联parent_id
。 假设child_id
1有四个父母,那么在child_id
列中它将拥有3个自身的child_id
,但是每个副本都与3个不同的parent_id
每一个相关联。
在这些条件下,我要达到的目的是按parent_id
排序,并通过仅基于最后一个或最接近的父对象(该父对象的级别是子对象的级别-1)选择一个来删除不需要的child_id
重复项。 那可能吗?
我试图在sqlfiddle上创建一个小提琴,但是我不断收到创建脚本错误,所以我想我将代码粘贴在这里:
CREATE TABLE `parent_child_columns` (`id` int auto_increment,
`child_id` int,
`parent_id` int,
`level` int,
PRIMARY KEY (`id`))
INSERT INTO `parent_child_columns` (`child_id`, `parent_id`, `level`)
VALUES (1, 0, 1), (2, 0, 1),
(3, 1, 2), (4, 1, 2),
(5, 3, 3), (5, 1, 3), (6, 3, 3), (6, 1, 3)
SELECT pc.child_id, pc.level
FROM parent_child_columns pc
ORDER BY pc.parent_id
通过此查询,重复项仍然会被拾取,因此当它应该排在另一列之后时,已经在另一列之前显示了列(因为在对ASC进行排序时,其1级父级位于顶部)。 (父列可以有许多子列。)如有必要,我可以在数据库中包括实际数据的屏幕截图。
我在这里构建一个动态表标题,您可以在其中添加无限数量的嵌套列。 关于行和列的排列方式还有很多其他内容,因此,如果我在此处的解释仍然含糊不清,并且您无法清楚了解情况,请告诉我。 但是我要做的事情基本上是我尝试逐行构建并根据父级上方父级列的顺序在每个子级(或行)中排列列。
预期的输出是,在实际表中, 1843应该小于1842 ,从数据库中可以看出其父级是1839和1842 。 我只是假设它已经在1841年以下,因为它早就被拿走了,但实际上并非如此吗? 关于是什么原因的更好的主意?
PS在上面的示例中,我尝试拆分1841,因此它下面应该有2个新列。
如果您希望父级的子级为“ -1”,请使用join
:
SELECT pc.*, pcp.id
FROM parent_child_columns pc LEFT JOIN
parent_child_columns pcp
ON pc.parent_id = pcp.child_id AND pcp.level = pc.level - 1
ORDER BY pc.parent_id;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.