Рекурсивный MySQL Рекурсивный запрос в реальных рекурсивных бизнес-сценариях

Java

Ставьте палец вверх, если вам это нравится!
исходный код

вводить

Когда я вижу некоторые комментарии, как показано ниже. Мне интересно, как реализована эта функция. Проверив информацию, я обнаружил, что на самом деле это рекурсивная операция MySQL. Позвольте мне показать вам, как реализовать рекурсивный запрос в MySQL.

База данных проектов

Наблюдая за этой структурой базы данных, вы обнаружите, что она имеет родительский узел на всем пути к корневому узлу, поэтому, когда мы проектируем базу данных, мы должны установить поле parentid. Итак, мы можем получить следующую базу данных.

SQL-скрипт выглядит следующим образом

CREATE TABLE digui(
	id INT(11) NOT null auto_increment,
	msg VARCHAR(255) not NULL COMMENT '评论的内容',
	parentid int(11) not null COMMENT '上一条',
	PRIMARY KEY(id)
)ENGINE=INNODB auto_increment = 100 DEFAULT CHARSET=utf8mb4;

INSERT into `digui`(msg, parentid) VALUES ('A', 0);
INSERT into `digui`(msg, parentid) VALUES('B', 1);
INSERT into `digui`(msg, parentid) VALUES('D', 3);
INSERT into `digui`(msg, parentid) VALUES('C', 2);

На самом деле существует много способов реализовать рекурсивный запрос в MySQL.

  1. Использование хранимых процедур MySQL
  2. Рекурсия кода прикладного уровня
  3. Тег коллекции MyBatis

Схема 1 Рекурсия кода прикладного уровня

//应用层递归查询
@Override
public List<Digui> getAll(int parent) {
    List<Digui> deptVosList=new ArrayList<>();
    QueryWrapper queryWrapper = new QueryWrapper();
    queryWrapper.eq("parentid", parent);
    List<Digui> list1 = list(queryWrapper);
    for (Digui digui: list1) {
        Digui digui1 = new Digui();
        digui1.setId(digui.getId());
        digui1.setMsg(digui.getMsg());
        digui1.setParentid(digui.getParentid());
        // 此处递归调用赋值
        digui1.setDiguiList(getAll(digui.getId()));
        deptVosList.add(digui1);
    }
    return deptVosList;

}

Схема 2 Этикетка коллекции MyBatis

 <resultMap id="RecursiveMap" type="com.example.lsbdigui.entity.Digui">
        <result property="id" column="id"/>
        <result property="msg" column="msg"/>
        <result property="parentid" column="parentid"/>
        <collection property="diguiList" ofType="com.example.lsbdigui.entity.Digui"
                    select="com.example.lsbdigui.mapper.DiguiMapper.getAllBySQL"
                    column="id"/>
</resultMap>
<select id="getAllBySQL" resultMap="RecursiveMap">
    select *
    from digui
    where parentid = #{parent}
</select>

использовать<collection>,<select>Теги реализуют рекурсивный запрос sql.

результат

{
    "code": 200,
    "msg": "正确返回",
    "date": [
        {
            "id": 100,
            "msg": "A",
            "parentid": 0,
            "diguiList": [
                {
                    "id": 101,
                    "msg": "B",
                    "parentid": 100,
                    "diguiList": [
                        {
                            "id": 103,
                            "msg": "C",
                            "parentid": 101,
                            "diguiList": [
                                {
                                    "id": 102,
                                    "msg": "D",
                                    "parentid": 103,
                                    "diguiList": []
                                }
                            ]
                        }
                    ]
                }
            ]
        }
    ]
}

В сравнении

предположение

Прикладной уровень может запрашивать все данные одновременно, а затем рекурсивно находить необходимые данные, что позволяет сократить количество запросов к базе данных и повысить производительность.

Ссылаться на

Обратите внимание на общедоступную учетную запись WeChat и прочитайте ее на мобильном терминале в любое время.

公众号.jpg