簡體   English   中英

如何將 CTE 轉換為普通查詢?

[英]How to convert CTE to normal query?

如何將其轉換為普通查詢?

WITH cte AS (
    SELECT agentID, 
           SUM(bonus > 0) OVER (PARTITION BY agentID 
                                ORDER BY `year` * 12 + `month`
                                RANGE BETWEEN 2 PRECEDING AND CURRENT ROW) flag
    FROM test
)
SELECT agentID
FROM cte
WHERE flag = 3;

我需要轉換它,因為我認為 mariadb 與 cte 不兼容。 我也不太熟悉 cte,我不知道如何將其分解為 php 中的正常 sql 查詢。

更新:

我試着這樣做來運行 cte

<?php
$servername = "localhost";
$username = "root";
$password = "";
$db = "sample_db";

// Create connection
$conn = new mysqli($servername, $username, $password, $db);

// Check connection
if ($conn->connect_error) {
  die("Connection failed: " . $conn->connect_error);
}


$stmt = $conn->query("SELECT agentID, bonus FROM (WITH cte AS (
    SELECT DISTINCT agentID, 
           SUM(bonus > 0) OVER (PARTITION BY agentID 
                                ORDER BY `year` * 12 + `month`
                                RANGE BETWEEN 2 PRECEDING AND CURRENT ROW) flag
    FROM sample_tbl
)) where agentID = '10710' && flag = 3");

    if($stmt->num_rows > 0){
        echo "You are elligible to take a course!";
    } else{
           echo "You are not elligible to take a course!";
        }




?>

但它不起作用,結果顯示

“致命錯誤:未捕獲的 mysqli_sql_exception:您的 SQL 語法有錯誤;請查看與您的 MariaDB 服務器版本對應的手冊,了解在 ') where agentID = '10710' && flag = 3' 中第 7 行附近使用的正確語法C:\xampp\htdocs\try\index.php:16 堆棧跟蹤:#0 C:\xampp\htdocs\try\index.php(16): mysqli->query('SELECT agentID,...') # 1 {main} 拋出 C:\xampp\htdocs\try\index.php 第 16 行"

事實上MariaDB 與 CTEs 兼容,但是如果您出於任何原因不想處理 ctes,您總是可以將其轉換為子查詢:

SELECT agentID
FROM (
    SELECT agentID, 
           SUM(bonus > 0) OVER (PARTITION BY agentID 
                                ORDER BY `year` * 12 + `month`
                                RANGE BETWEEN 2 PRECEDING AND CURRENT ROW) flag
    FROM test ) agents_with_summed_bonus
WHERE flag = 3;

如果此查詢代替使用 cte 構建的查詢對您不起作用,那么這意味着您的初始查詢在與您的表相關時存在一些錯誤。

再次更新:

它現在為我工作,這是我的最終代碼:

<?php
$servername = "localhost";
$username = "root";
$password = "";
$db = "sample_db";

// Create connection
$conn = new mysqli($servername, $username, $password, $db);

// Check connection
if ($conn->connect_error) {
  die("Connection failed: " . $conn->connect_error);
}


$stmt = $conn->query("SELECT DISTINCT agentID FROM (SELECT DISTINCT agentID, 
SUM(bonus > 0) OVER (PARTITION BY agentID 
                     ORDER BY `year` * 12 + `month`
                     RANGE BETWEEN 2 PRECEDING AND CURRENT ROW) flag from sample_tbl) as cte where agentID = '61599' && flag = 3");

    if($stmt->num_rows > 0){
        echo "You are elligible to take a course!";
    } else{
           echo "You are not elligible to take a course!";
        }




?>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM