在php中如何从一个sql表中减去另一个sql表中的数据?

hvvq6cgz  于 2021-06-23  发布在  Mysql
关注(0)|答案(2)|浏览(298)

我已经创建了移动游戏,我在sql表中存储了得分数据(本例中是矿物)。现在我想用两天前的分数减去昨天的分数来创建每日分数表。我发现我可以做这件事,除了但我尝试什么都不管用。

$sql = "SELECT playerid, playername, minerals, daydate
    FROM dailyscore WHERE daydate = '".$yesterday."'
    EXCEPT
    SELECT playerid, playername, minerals, daydate
    FROM dailyscore WHERE daydate = '".$twodays."'
    ORDER BY minerals DESC";

我得到这个错误:sql错误:“你的sql语法有错误;请查看与您的mysql服务器版本对应的手册,以获取正确的语法,该语法可用于“除从dailyscore中选择playerid、playername、minerals、daydate外的第3行”

nc1teljy

nc1teljy1#

mysql不支持 EXCEPT . 我想你有个用处:

SELECT ds.playerid, ds.playername, ds.minerals, ds.daydate
FROM dailyscore ds
WHERE daydate = '".$yesterday."' AND
      NOT EXISTS (SELECT 1
                  FROM dailyscore
                  WHERE ds2.playerid = ds.playerid AND
                        ds2.minerals = ds.minerals AND
                        ds2.daydate = '".$twodays."'
                 )
ORDER BY ds.minerals DESC;

注意:您不应该通过mung字符串来传递参数。您应该学会正确地传递参数,使用占位符,例如 ? .

ibps3vxo

ibps3vxo2#

不需要像except或minus这样的set运算符。将两天的分数相加,计算出每日分数的差值:

SELECT playerid, playername, minerals
FROM (
    SELECT ds_yesterday.playerid,
        ds_yesterday.playername,
        CASE
            WHEN ds_twodays.minerals IS NULL
            THEN ds_yesterday.minerals
            ELSE ds_yesterday.minerals - ds_twodays.minerals
        END minerals
    FROM dailyscore as ds_yesterday
    LEFT JOIN dailyscore as ds_twodays ON 
        ds_twodays.playerid = ds_yesterday.playerid
        AND ds_twodays.daydate = '2018-08-07'
    WHERE ds_yesterday.daydate = '2018-08-08'
) scoredifference
ORDER BY minerals DESC;

您可以使用这个sql并将其放入php代码中。日期应该被存储在php变量中的值替换。

相关问题