回答

收藏

PHP PDO-使用MySQL变量

技术问答 技术问答 133 人阅读 | 0 人回复 | 2023-09-13

我正在尝试使用PDO在PHP中运行查询。该查询在顶部具有一些变量来确定排名,除了在$ sql中使用SET
  y8 x9 ?& E3 [: W' \@var时,它返回一个空行集。但是,如果删除有问题的SQL,它会返回正常值。
% I+ ?: X; ?- n: `我不想在我的脚本中返回@ prev_value,@ rank_count或@rank_increasing,仅返回它在SELECT中创建的排名。3 U* R% A, H% E/ I, j' {" ]$ q
你能告诉我我做错了吗?
- A8 J5 \+ ]3 a% R# ]1 ?9 c+ C谢谢
, N8 H: C7 |2 N% f    $sql = "
. t9 |/ C& ]  U  n4 P' N    SET @prev_value = NULL;
2 l7 V$ U5 _1 k1 U6 c7 n    SET @rank_count = 0;* F+ I7 x- S0 ]  A: u
    SET @rank_increasing = 0;: ?- ]; h, X# N$ t
    SELECT a.*; m4 x& c* h& h0 A$ i4 C0 M+ j7 P
         , @rank_increasing := @rank_increasing + 1 AS row_num
" p% ?* d& E2 }0 Y         , CASE
9 m9 X1 ^% ~% K           WHEN @prev_value = score 0 L- U0 z: R3 _7 f+ J* P
              THEN @rank_count* T& \$ Y0 j$ U& |
           WHEN @prev_value := score
# h2 o9 Q, K5 M; l              THEN @rank_count := @rank_increasing1 b- H) I; s. T4 [2 H9 _2 T1 f# U' L
           END AS rank8 w$ D! z4 \7 z  L* o: I' Z& U
      FROM ( # c$ l1 s+ T" h" V: |5 M% P! u
           -- INLINE VIEW --8 C, m) j0 \/ }  V/ ?; R
           ) a# W. Y, |! `. J/ u6 ?
    ";3 F$ m2 {. D( I5 n9 r1 Y1 n; l+ T
    try {3 g- b$ u2 u5 p0 S9 C1 `  v' q) \% q& J
        $sth = $dbh->prepare($sql);% ~  s5 G2 T, W# r+ o: i# P
        $sth->execute(array($var1, $var2));8 ]# V5 J3 Y; v
        return $sth->fetchAll(PDO::FETCH_ASSOC);
- D4 }. ~& {, Z0 [    } catch (Exception $e) {/ U: N3 N* q: u3 x7 I- z
        return $e;
1 z0 \2 ~! |! U" l9 c    }5 Z) d1 g' F  G! i6 o
                # P, M8 p1 ]+ X. T
解决方案:
3 Y; @% t# u1 G2 C6 M9 B                3 E8 ]1 g3 e/ h8 j+ c2 l

; f( b, [4 x+ C1 w$ }) u5 W$ _5 f
                在此处找到解决方案:https :: d' O+ |& N, q+ e/ h
//stackoverflow.com/a/4685040/1266457
  b9 @- {6 }+ e谢谢 :)
/ X" B/ u. I8 o# ]修理:
5 a/ e6 o5 }+ S0 b// Prepare and execute the variables first
4 b& W& A$ T' t4 ?4 p1 \: L; q$sql = "
/ H3 Q1 ~6 ?4 F% o6 N6 S1 j! CSET @prev_value = NULL;
! ?8 r. C8 f5 Y# DSET @rank_count = 0;
8 `- y( u! g8 Q+ S9 [2 {" ~, w+ tSET @rank_increasing = 0;: v* W' c, d2 A/ I. l
";
9 ?- e% d2 J/ C1 F9 D$sth = $dbh->prepare($sql);
, v" t7 o" G3 H5 y/ }- A$sth->execute();
4 p' r( @: f, Z& `0 s9 j2 L" {// Run the main query, H3 I3 i" i" I3 {9 z* _
$sql = "# D3 ]% S: \3 ]
SELECT a.*
& u/ H4 A' U/ Y) w" S: q     , @rank_increasing := @rank_increasing + 1 AS row_num
4 [6 g* M* M9 q4 ]0 E9 ~  ?. [     , CASE6 W1 G4 k% O; T7 g! R! q* Z
       WHEN @prev_value = score
' Q, O1 Z, t$ X2 v          THEN @rank_count
2 L  j+ {1 v( q0 W* \6 ^       WHEN @prev_value := score
9 c. o/ g6 @) M- r          THEN @rank_count := @rank_increasing
& h  ^0 t+ Z# a4 k% M       END AS rank6 g# w" @. I3 a7 w) t
  FROM (
/ f6 h# e: I  _       -- INLINE VIEW --
. x6 O' M2 l+ S8 E& e       ) a
/ ~  i9 y- V. L) U"; ...
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则