我有一个系统,其中包含的每个项可能属于多个父项。我需要能够检索项目的所有子项,也就是这些子项的子项。好吧,共有5个级别。
每个项目都有一个(或应该有一个)名为“ belongs_to_json”的json列(还有更多列,例如“ id”和whatnot),其中包含每个父订单组合。例如[{“父母”:2,“订单”:4},{“父母”:13,“订单”: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%;
显然不是真实的东西,但我希望有一个等效的东西。或者也许以其他方式解决问题。
答案 0 :(得分:1)
您只需在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