繁体   English   中英

根据表数据有条件地执行SQ​​L查询/语句

[英]Execute a SQL query/statement conditionally based on table data

首先,看看这个表,基本上我需要UPDATE(+1)一个票据,其中Username等于Jondoe和Money大于200。

在此输入图像描述

现在,我知道我可以执行3个查询,首先检查实际用户是否将Jondoe作为用户名,然后检查他是否有足够的资金,如果这些结果为真,则最后更新(+1)一张票。

我正在学习SQL,而且我正在研究一个mssql数据库,这种条件查询/更新的正确方法是什么? 我可以避免使用那么多查询吗?

我也在使用laravel框架,我不知道它是否带有任何“工具”来完成我想要的东西。

提前致谢

您正在寻找的是使用UPDATE语句和WHERE语句来设置您需要的内容,这就是您的操作方法。 通过laravel解析命令,它将相应更新。

UPDATE TableName Set Tickets=Tickets+1 WHERE USERNAME='JonDoe' AND Money > 200

使用Eloquent:

\App\User::where('username','JonDoe')->where('Money','>',200)->increment('Tickets');

我不是Laravel的专家,但是和其他许多框架一样,它应该有一个ORM系统(对象关系映射: https ://en.wikipedia.org/wiki/Object-relational_mapping),这个系统可以帮助你“说话”以面向对象的方式使用数据库(使用getFirstByPrimaryKey($ primaryKey)等方法)。

这就是说,我认为当你已经知道如何手动完成时,那种系统会更好。

在你提议的情况下,你必须首先考虑你需要什么,然后想想实现它的更好方法是什么。

你需要什么:

如果该用户具有更多或等于某个数量,则为一个用户插入故障单。

让我想一想,也许你会在成功创建门票之后从金钱领域中取出这笔数量,对吧?

所以我认为我们正在卖票,正常的步骤应该是:

  • 检查用户是否已登录。 如果已记录,我们可能在会话或类似系统中具有用户ID。 如果可能的话,在索引数字字段中搜索要好得多。

  • 获得user_id后,如果该用户ID有足够的资金用于此操作,我们会更新该行:

//pseudo code
        $userId = 12;
        $cost = 200;
        $query = "update ticketstable set tickets=tickets+1, money=money-$cost 
    where id='$userId' and money >= $cost";
        $result = $db->query($query);

        if($result){
          //row with id = $userId has been updated
        }else{
          //There's not a row with $userId, or that row's money was less than $cost
        }

在处理货币操作时考虑到你应该将所有相关查询作为一个交易(数据库中的事务argot意味着一起执行几个sql语句,如果一些失败,所有其他的都被还原,以避免不一致)。

如果您在两个查询中划分我的提案:

1)检查id = x的用户是否有钱> = $ cost;

2)更新资金 - = $ cost;

您可以在用户或其他自动化流程从步骤1和步骤2之间的同一行中获取一些资金的情况下找到,然后以负资金结束,并允许您不应该进行操作。

Laravel有一个流畅的查询构建器,您可以使用(或多或少)如下所示:

$affectedRows = DB::table('TableName')
    ->where("Username", "Jondoe")
    ->where("Money",">",200)
    ->increment("Tickets");

您还可以使用$affectedRows来检查是否有任何更新。

编辑:

如果您有一个用户模型(例如,名为User ),那么您可以使用相同的语法,但使用Eloquent。

例:

User::where("Username", "Jondoe")
    ->where("Money",">",200)
    ->increment("Tickets");

Eloquent是Laravel的ORM(对象关系模型),它提供了关系数据库和PHP对象(即MVC框架的模型部分)之间的映射。 它不是一个查询构建器本身,但它确实使用流畅的后台来构建查询。

参考https://laravel.com/docs/5.0/queries

试试这个命令

UPDATE TableName Set Tickets=Tickets+1 WHERE USERNAME='JonDoe' AND Money > 200

希望这将解决您的问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM