我在围绕SQL闭包表时遇到了一些困难,并希望在理解我找到的一些示例时提供一些帮助.
假设我有一个sample_items带有以下分层数据的表:
id name parent_id
1 'Root level item #1' 0
2 'Child of ID 1' 1
3 'Child of ID 2' 2
4 'Root level item #2' 0
Run Code Online (Sandbox Code Playgroud)
树结构应该是这样的:
id
| - 1
| | - 2
| | - 3
| - 4
Run Code Online (Sandbox Code Playgroud)
为了便于查询树(例如找到特定id的所有后代),我有一个表,sample_items_closure使用Bill Karwin在这个优秀的SO帖子中描述的方法.我还使用可选path_length列来在需要时查询直接子或父.如果我正确理解这个方法,我的闭包表数据将如下所示:
ancestor_id descendant_id path_length
1 1 0
2 2 0
1 2 1
3 3 0
2 3 1
1 3 2
4 4 0
Run Code Online (Sandbox Code Playgroud)
sample_items …
mysql tree recursion hierarchical-data transitive-closure-table
我目前正在一个基于 PHP 的项目中使用 IPv4 和 IPv6 地址,并且我需要能够比较两个 IP 以确定哪一个数字更大。例如,192.168.1.9 大于 192.168.1.1。为了做到这一点,我使用inet_pton和unpack将 IP 转换为二进制字符串(我熟悉ip2long,但它仅限于 IPv4)。
这种方法一开始似乎工作正常,但我很快发现,当我将任何以 .32 结尾的 IP 与较低的 IP 地址进行比较时,我得到的结果不正确。例如,如果我将 192.168.1.0 与 192.168.1.32 进行比较,我的脚本会告诉我 192.168.1.0 大于 192.168.1.32。仅当其中一个 IP 以 0.32 结尾时才会发生这种情况。IP 的前三个八位字节可以更改,结果是相同的。
以下 PHP 代码生成一个说明此问题的页面:
// Loop through every possible last octet, starting with zero
for ($i = 0; $i <= 255; $i++) {
// Define two IPs, with second IP increasing on each loop by 1
$IP1 = "192.168.1.0";
$IP2 = "192.168.1.".$i; …Run Code Online (Sandbox Code Playgroud)