在 PHP 中使用 WITH SQL 查询

发布于 2025-01-03 10:39:32 字数 1185 浏览 3 评论 0原文

我尝试重写下面的查询,以便它可以在 PHP 页面中工作,但是我找不到任何有关如何在 PHP 中使用“;WITH”语句或如何实现相同效果的文档使用有效的 PHP 查询。在 MS SQL 2008 R2 Management Studio 中执行时,该查询工作完美,但当我尝试从 SQLMaestro 将其加载到 MSSQL PHP 生成器时,它会出现错误。

查询是:

;WITH UserStars AS
(
    SELECT a.username, ROUND(AVG(CAST(b.stars AS FLOAT)),1) Stars
    FROM score b
    JOIN game_users a ON a.id = b.game_users_id
    GROUP BY a.username
)
SELECT  CASE WHEN Stars < 1.4 THEN 'StarAmount1'
        WHEN Stars BETWEEN 1.4 AND 2.4 THEN 'StarAmount2'
        WHEN Stars BETWEEN 2.4 AND 3.4 THEN 'StarAmount3'
        WHEN Stars BETWEEN 3.4 AND 4.4 THEN 'StarAmount4'
        WHEN Stars BETWEEN 4.4 AND 5.0 THEN 'StarAmount5' ELSE 'AnotherStarAmount' END         StarAmount,
        COUNT(*) Users
FROM UserStars
GROUP BY CASE WHEN Stars < 1.4 THEN 'StarAmount1'
         WHEN Stars BETWEEN 1.4 AND 2.4 THEN 'StarAmount2'
         WHEN Stars BETWEEN 2.4 AND 3.4 THEN 'StarAmount3'
         WHEN Stars BETWEEN 3.4 AND 4.4 THEN 'StarAmount4'
         WHEN Stars BETWEEN 4.4 AND 5.0 THEN 'StarAmount5' ELSE 'AnotherStarAmount' END

有人能给我指出正确的方向,以便可以在 PHP 和 MS SQL 2008 R2 Management Studio 中使用相同的查询吗?

I have tried to rewrite the below query, so that it will work in a PHP page, but I have not been able to find any documentation on how the ";WITH" statement can be used in PHP, or how to make the same effect with a valid PHP Query.. The Query works perfect when executet in MS SQL 2008 R2 Management Studio, but it gives errors when I try to load it into MSSQL PHP Generator from SQLMaestro.

The query is:

;WITH UserStars AS
(
    SELECT a.username, ROUND(AVG(CAST(b.stars AS FLOAT)),1) Stars
    FROM score b
    JOIN game_users a ON a.id = b.game_users_id
    GROUP BY a.username
)
SELECT  CASE WHEN Stars < 1.4 THEN 'StarAmount1'
        WHEN Stars BETWEEN 1.4 AND 2.4 THEN 'StarAmount2'
        WHEN Stars BETWEEN 2.4 AND 3.4 THEN 'StarAmount3'
        WHEN Stars BETWEEN 3.4 AND 4.4 THEN 'StarAmount4'
        WHEN Stars BETWEEN 4.4 AND 5.0 THEN 'StarAmount5' ELSE 'AnotherStarAmount' END         StarAmount,
        COUNT(*) Users
FROM UserStars
GROUP BY CASE WHEN Stars < 1.4 THEN 'StarAmount1'
         WHEN Stars BETWEEN 1.4 AND 2.4 THEN 'StarAmount2'
         WHEN Stars BETWEEN 2.4 AND 3.4 THEN 'StarAmount3'
         WHEN Stars BETWEEN 3.4 AND 4.4 THEN 'StarAmount4'
         WHEN Stars BETWEEN 4.4 AND 5.0 THEN 'StarAmount5' ELSE 'AnotherStarAmount' END

Could someone point me in the right direction, so that the same query could be used in both PHP and in MS SQL 2008 R2 management studio?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

第七度阳光i 2025-01-10 10:39:32

试试这样:

SELECT  CASE WHEN Stars < 1.4 THEN 'StarAmount1'
        WHEN Stars BETWEEN 1.4 AND 2.4 THEN 'StarAmount2'
        WHEN Stars BETWEEN 2.4 AND 3.4 THEN 'StarAmount3'
        WHEN Stars BETWEEN 3.4 AND 4.4 THEN 'StarAmount4'
        WHEN Stars BETWEEN 4.4 AND 5.0 THEN 'StarAmount5' ELSE 'AnotherStarAmount' END         StarAmount,
        COUNT(*) Users
FROM (SELECT a.username, ROUND(AVG(CAST(b.stars AS FLOAT)),1) Stars
    FROM score b
    JOIN game_users a ON a.id = b.game_users_id
    GROUP BY a.username) UserStars
GROUP BY CASE WHEN Stars < 1.4 THEN 'StarAmount1'
         WHEN Stars BETWEEN 1.4 AND 2.4 THEN 'StarAmount2'
         WHEN Stars BETWEEN 2.4 AND 3.4 THEN 'StarAmount3'
         WHEN Stars BETWEEN 3.4 AND 4.4 THEN 'StarAmount4'
         WHEN Stars BETWEEN 4.4 AND 5.0 THEN 'StarAmount5' ELSE 'AnotherStarAmount' END

Try it like this:

SELECT  CASE WHEN Stars < 1.4 THEN 'StarAmount1'
        WHEN Stars BETWEEN 1.4 AND 2.4 THEN 'StarAmount2'
        WHEN Stars BETWEEN 2.4 AND 3.4 THEN 'StarAmount3'
        WHEN Stars BETWEEN 3.4 AND 4.4 THEN 'StarAmount4'
        WHEN Stars BETWEEN 4.4 AND 5.0 THEN 'StarAmount5' ELSE 'AnotherStarAmount' END         StarAmount,
        COUNT(*) Users
FROM (SELECT a.username, ROUND(AVG(CAST(b.stars AS FLOAT)),1) Stars
    FROM score b
    JOIN game_users a ON a.id = b.game_users_id
    GROUP BY a.username) UserStars
GROUP BY CASE WHEN Stars < 1.4 THEN 'StarAmount1'
         WHEN Stars BETWEEN 1.4 AND 2.4 THEN 'StarAmount2'
         WHEN Stars BETWEEN 2.4 AND 3.4 THEN 'StarAmount3'
         WHEN Stars BETWEEN 3.4 AND 4.4 THEN 'StarAmount4'
         WHEN Stars BETWEEN 4.4 AND 5.0 THEN 'StarAmount5' ELSE 'AnotherStarAmount' END
同展鸳鸯锦 2025-01-10 10:39:32

这不是一种完全直观的方法,而是一种无需所有 CASE 表达式即可给猫剥皮的不同方法:

;WITH x AS 
(
    SELECT 
        c = game_users_id, 
        [avg] = AVG(CONVERT(DECIMAL(2,1), stars))
    FROM score
    GROUP BY game_users_id
), 
y AS
(
    SELECT StarAmount = 'StarAmount' 
        + LEFT(CONVERT(DECIMAL(2,1), [avg]+.6), 1)
        FROM x
)
SELECT StarAmount, Users = COUNT(*)
    FROM y
    GROUP BY StarAmount
    ORDER BY StarAmount;

Not an altogether intuitive approach, but a different way to skin the cat without all the CASE expressions:

;WITH x AS 
(
    SELECT 
        c = game_users_id, 
        [avg] = AVG(CONVERT(DECIMAL(2,1), stars))
    FROM score
    GROUP BY game_users_id
), 
y AS
(
    SELECT StarAmount = 'StarAmount' 
        + LEFT(CONVERT(DECIMAL(2,1), [avg]+.6), 1)
        FROM x
)
SELECT StarAmount, Users = COUNT(*)
    FROM y
    GROUP BY StarAmount
    ORDER BY StarAmount;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文