在MYSQL中,是否可以选择将在WHERE子句中定义的内容?

时间:2019-05-29 23:15:37

标签: php mysql json

我有一个系统,其中包含的每个项可能属于多个父项。我需要能够检索项目的所有子项,也就是这些子项的子项。好吧,共有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%;

显然不是真实的东西,但我希望有一个等效的东西。或者也许以其他方式解决问题。

1 个答案:

答案 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