[英]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.