繁体   English   中英

MySQL 5.7 使用 JSON 变量作为对 Laravel 5.4 中的行进行排名的计数器

[英]MySQL 5.7 using JSON variable as counter to rank rows in Laravel 5.4

我正在使用 MySQL 5.7 并尝试使用 JSON 变量来模拟排名(在 5.7 中不可用)。

问题是在 Laravel DB 或 PDO 中,下面的查询不能正常工作,但在 TablePlus 中工作正常。

查询按组计数行并过滤计数器小于 250 的行的想法。每个组行在 json 变量中都有自己的计数器。

这个查询的想法:

select result.*
from (
    select 
        @extracted_counter:=JSON_EXTRACT(@row_number, CONCAT('game', t.game_id)) as extracted_counter,
        JSON_SET(@row_number, CONCAT('key', t.game_id), @extracted_counter + 1) as counters,
        t.*
    from (@row_number := '{"game1": 0, "game27": 0}') as x,
        table_name as t
    where t.app_id = 16325
) as result
where result.extracted_counter < 250;

@json_variable从另一个表构建。 我把它做成一个字符串来简化。

同样,原始查询在 TablePlus 程序中工作正常,但是当涉及到 Laravel 5.4 DB 时, @row_number不能执行超过 3 的加法,例如: "{"game27718": 0,"game27398": 3,"game26592": 0,"game24042": 0,"game23957": 3}"

我认为 Laravel 使用特定的 PDO 设置,但找不到任何东西。 此外,我尝试使用CAST ,但它并没有真正帮助,因为添加适用于前三个记录。

不太确定 TablePlus 和 PDO Laravel 的设置有何不同。 我试过用谷歌搜索 TablePlus 的设置,但我无法想象如何正确地用谷歌搜索它而不碰到界面文档。

我将不胜感激任何帮助。

我尝试使用的原始查询如下所示:

SELECT temp.*
FROM (
    SELECT
    @extracted_counter:=CAST(JSON_EXTRACT(@row_number, CONCAT('$.game', sao.game_id)) AS UNSIGNED) AS extracted_rank,
    if(
        @extracted_counter < @games_length,
        @row_number:=JSON_SET(
            @row_number,
            CONCAT('$.game', sao.game_id),
            @extracted_counter + 1
        ),
        @const_length
    ) AS rnk,
    sao.email, sao.name,
    sao.game_id, sao.order_total_price,
    sao.device_type, sao.coupon_id,
    sao.coupon_code, sao.browser,
    sao.city, sao.country,
    sao.order_id, sao.created_at
    FROM (SELECT @row_number := (
        SELECT concat('{', group_concat(concat('"game', s.game_id, '"'), ': 0'), '}') AS str_json
        FROM (
            SELECT g.id AS game_id
            FROM users AS u
            LEFT JOIN games AS g ON u.id = g.user_id
            WHERE u.app_id = 16325
                AND g.deleted_at IS NULL
        ) AS s
    )) AS x,
    (SELECT @games_length := 250) AS games_length,
    (SELECT @const_length := @games_length + 100) AS const_length,
    shopify_app_orders as sao
    WHERE sao.app_id = 16325
        AND sao.coupon_id > 0
    ORDER BY sao.id DESC
) AS temp
LEFT JOIN coupons AS c ON c.id = temp.coupon_id
WHERE temp.extracted_rank < @games_length

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM