我有一个系统,其中包含的每个项目都可能属于多个父级。我需要能够检索一个项目的所有子项,它是子项的子项。真让人恶心。好的,这里有5个级别。
每个项目都有(或者应该有)一个名为"belongs_to_json“的json列(还有更多的列,比如"id”和诸如此类的东西),其中包含每个父订单组合。例如{"parent":2,"order":4},{"parent":13,"order":1}
我可以通过组合PHP和MYSQL来搜索这个以及具有相同父对象的其他对象(在之前的stackoverflow中找到了这个想法)
首先,我运行一个查询(codeigniter框架),获取一些项目父项,并将查询放入一个$qry_classes变量中。
$sql_classes = "SELECT t.id
FROM table t
WHERE JSON_SEARCH(t.belongs_to_json, 'all', '2') LIKE '%.parent%';";
$qry_classes = $this->db->query($sql_classes);
然后,我使用该查询的结果编写一个新的WHERE语句。
$s_rewrite_array = array_map(function($row) {
return "JSON_SEARCH(t.belongs_to_json, 'all', '{$row->id}') LIKE '%.parent%'";
}, $qry_classes->return_array() );
$sections_condition = implode(" OR ", $s_rewrite_array);
$sql_sections = "
SELECT t.id
FROM table t
WHERE ($sections_condition)
";
$qry_sections = $this->db->query($sql_sections);
当我有一个具有多个父项的项,并且我想在SELECT子句中返回WHERE子句中使用的父项时,问题就来了。
就像这样
SELECT t.*, non_existant_column FROM table t WHERE
JSON_SEARCH(t.belongs_to_json, 'all', '{$row->id}' as non_existant_column) LIKE '%.parent%;
显然不是真正的东西,但我希望有一个等效的东西。或者用不同的方式来解决这个问题。
发布于 2019-05-30 07:53:10
您可以只使用在SELECT
列表中放入一个文字,您不需要从WHERE
子句中获取它。
SELECT t.*, '{$row->id}' AS parent
FROM table t
WHERE JSON_SEARCH(t.belongs_to_json, 'all', '{$row->id}') LIKE '%.parent%;
如果您使用的是MySQL 8.0,那么您可能可以使用JSON_TABLE
而不是您的方法来查找parent: 2
。请参阅MySQL Return JSON array index based on property value
https://stackoverflow.com/questions/56369683
复制相似问题