将查询从MySQL V8.0转换为V5.6

时间:2018-10-05 22:32:17

标签: mysql partition row-number

我开发了基于MySQL V8.0的系统,不幸的是,我需要降级Web托管中最常用的版本,即V5.6。

我的查询几乎都是这样的:

SELECT tb_d.*, id_classification 
FROM (
    SELECT ROW_NUMBER() OVER(PARTITION BY '1' ORDER BY od_category ASC, $order_by_gp_mid) AS row_final, tb_c.*
    FROM (
        SELECT ROW_NUMBER() OVER(PARTITION BY id_category ORDER BY MOD(`row` * $prime_group, 512)) AS rd_category, tb_b.*
        FROM (
            SELECT ROW_NUMBER() OVER(PARTITION BY '1' ORDER BY od_category ASC, $order_by_gp_mid) AS `row`, tb_a.*
            FROM (
                SELECT ROW_NUMBER() OVER (PARTITION BY id_category ORDER BY od_category ASC, tb_x.$order_by_gp_mid) AS rn_category, tb_x.*
                FROM (
                    SELECT
                    1, od_category, id_category, `group`, category,
                    id_post, thumbnail, head, visibility, created_datetime, `view`, yeslike, save,
                    lk_post_category_pic_uvw.fk_pic, 
                    ROUND((yeslike + total_save) / view, 3) AS rank_ratio

                    FROM tb_category

                    JOIN (
                        SELECT fk_post, fk_category, fk_pic
                        FROM lk_post_category_pic

                        UNION

                        SELECT fk_post, `from`, fk_pic
                        FROM lk_post_model_pic
                        JOIN tb_model ON tb_model.id_model = lk_post_model_pic.fk_model
                        WHERE `from` != ''
                    ) AS lk_post_category_pic_uvw   ON lk_post_category_pic_uvw.fk_category = tb_category.id_category
                    JOIN tb_post                    ON lk_post_category_pic_uvw.fk_post     = tb_post.id_post
                    LEFT JOIN vw_total_save_by_post ON vw_total_save_by_post.fk_post    = tb_post.id_post

                    WHERE visibility = 'show'

                ) AS tb_x
            ) AS tb_a

            WHERE rn_category <= 35
        ) AS tb_b
    ) AS tb_c

    WHERE rd_category = 1
) AS tb_d

JOIN lk_post_classification_pic ON tb_d.id_post = lk_post_classification_pic.fk_post 
JOIN tb_classification          ON lk_post_classification_pic.fk_classification = tb_classification.id_classification

变量$ order_by_gp_mid可以采用以下值:

$order_by_gp_mid = 'created_datetime DESC';
$order_by_gp_mid = 'rank_ratio DESC';
$order_by_gp_mid = '`view` DESC';
$order_by_gp_mid = 'created_datetime DESC';
$order_by_gp_mid = 'created_datetime ASC';

因此,这里最大的问题是行ROW_NUMBER()OVER(PARTITION BY blabla ...)。

对于MySQL 5.6,我需要重写此查询以及许多其他查询。

我已经在stackoverflow中阅读了很多有关此的主题,但是由于我的查询非常复杂,所以我不知道如何做。

所以,我不知道该怎么办了,我已经完全精疲力尽了计算机编程。

0 个答案:

没有答案