sql语句中mysql会话变量值的优先级
在SQL语句中使用时会话变量的标准行为是什么. 案例1 : 在下面的示例中,会话变量的行为如预期的. mysql> set @m1=0, @m2=0, @m3=0; Query OK, 0 rows affected (0.00 sec) mysql> mysql> select -> @m1 := 55 m1, @m2 := 42 m2, @m3 := 66 m3, -> @m1, @m2, @m3, -> @b1 := greatest( @m1, @m2, @m3 ) b1, -> @b2 := ( ( @total := @m1 + @m2 + @m3 ) -> - ( @b1 + least( @m1, @m2, @m3 ) )) b2, -> @total total; +----+----+----+------+------+------+------+------+------
30 2024-01-19
编程技术问答社区
MySQL复杂子查询的制定
我有两个表 - books和images. books具有id,name,releasedate,purchasecount之类的列. images has bookid(与书籍中的id相同,基本上一本书可以具有多个图像.尽管我没有设置任何外键约束),poster,poster(每个记录点对于某个存储桶中的图像文件,对于特定bookid). 表模式: poster在images中是唯一的,因此它是主要键. 覆盖书籍上的索引:(name,id,releasedate) 覆盖图像上的索引:( bookid,poster,bucketid) 我的查询是一个名字,从书籍表中找到了前十本书(按purchasecount的数量排序),其名称与该名称匹配该名称,而对于该书,请返回任何(最好是第一个)记录(bucketid和poster)来自images表. 显然,这可以通过第一个查询来解决两个查询,并使用其结果来查询图像表,但这会很慢,因此我想使用'join''和subqu
18 2023-10-05
编程技术问答社区
在PHP中用游标执行一个存储过程
我有一个存储的过程,我试图从我的PHP中调用.这是存储过程: BEGIN DECLARE done INT DEFAULT FALSE; declare phone_temp VARCHAR(20) default ''; declare phone_cur cursor for SELECT DISTINCT sentNum FROM Queue; declare continue handler for not found set done = true; #create temp table create temporary table if not exists temp_return AS SELECT * FROM Queue LIMIT 0; #empty if exists delete from temp_return; open phone_cur; phone_loop: LOOP fetch phone_cur into phone_temp;
14 2023-09-30
编程技术问答社区
删除MySQL中的记录 WHERE id IN (@VARIABLE)-(2,3,4)
是否有一种使用WHERE IN @VARIABLE? 删除记录的方法 -- DEMO TABLE CREATE TABLE people ( id int AUTO_INCREMENT NOT NULL, name varchar(100), age int, active smallint DEFAULT 0, PRIMARY KEY (id) ); -- DEMO DATA INSERT INTO people(id, name, age, active) VALUES (1, 'Jon', 37, 1), (2, 'Jack', 23, 0), (3, 'Peter', 24, 0), (4, 'Phil', 55, 0); 创建变量: SELECT @REMOVE := GROUP_CONCAT(id) FROM people WHERE active
20 2023-09-21
编程技术问答社区
提高SQL查询性能的建议
发布我正在使用的问题声明和当前代码,并想知道是否有任何明智的想法可以提高查询性能?使用mysql.谢谢. 编写一个SQL查询以排名分数.如果两个分数之间有平局,则两者都应具有相同的排名.请注意,在平局之后,下一个排名号应该是下一个连续的整数值.换句话说,等级之间不应有"孔". +----+-------+ | Id | Score | +----+-------+ | 1 | 3.50 | | 2 | 3.65 | | 3 | 4.00 | | 4 | 3.85 | | 5 | 4.00 | | 6 | 3.65 | +----+-------+ 例如,给定上述分数表,您的查询应生成以下报告(按最高分数订购): +-------+------+ | Score | Rank | +-------+------+ | 4.00 | 1 | | 4.00 | 1 | | 3.85 | 2 | | 3.65 | 3
38 2023-09-18
编程技术问答社区
如何显示所有用户定义的变量(MySQL)
i设置两个用户定义的变量如下所示,但是一段时间后,我忘记了名称: SET @a = 2, @b = 3; 那么,mySQL是否具有显示所有用户定义变量的命令? 解决方案 从MySQL 5.7开始,性能架构公开了用户变量. 请参阅表performance_schema.user_variables_by_thread 其他解决方案 如果您的Mariadb(相当于MySQL的二进制" Drop-in"),则有一个可用的插件,由Mariadb本身提供. mariadb 10.2(相当于MySQL 5.7)及以上具有一个插件,该插件可创建" user_variables"表. 这是如何这是其用途的一个示例: SELECT * FROM information_schema.USER_VARIABLES ORDER BY VARIABLE_NAME; +---------------+----------------+---------------+
42 2023-09-17
编程技术问答社区
在mysql中按用户的积分排名
我试图按照我之前计算的观点进行排名 但是问题是,如果学生有相同的观点,他们俩都应该处于相同的等级 例如 学生1有完整的积分 学生2有完整的积分 他们都必须排名1; 这里是我的数据库的示例 我要做的查询是(仅对于选择,我就可以将值插入我的列) SELECT a.points count(b.points)+1 as rank FROM examresults a left join examresults b on a.points>b.points group by a.points; 编辑更清晰: 学生1分80 学生2分77.5 学生3分77.5 学生4分77 他们的等级应该像 学生1等级1 学生2等级2 学生3等级2 学生4等级3 我的当前查询返回 之类的值 因为它缺少第三级排名. (因为第二等级有2个值) 解决方案 这只是使用变量的Gordon解决方案的修复.问题是您的排名
54 2023-09-16
编程技术问答社区
为什么涉及用户变量的表达式的评估顺序未被定义?
来自 mysql手册查询不能总是相同的. SET @a := 0; SELECT @a AS first, @a := @a + 1 AS second, @a := @a + 1 AS third, @a := @a + 1 AS fourth, @a := @a + 1 AS fifth, @a := @a + 1 AS sixth; 输出: first second third fourth fifth sixth 0 1 2 3 4 5 用手册引用: 但是,涉及用户表达式的评估顺序 变量未定义; 我想知道背后的故事. 所以我的问题是: 为什么涉及用户变量的表达式的评估顺序不确定? 解决方案 select中表达式评估顺序是不确定的.在大多数情况下,您只会在有变量时注意到这一点,因为错误会导致错误的信息. 为什么? SQL标准不需要评估顺序,因此每个数据库都可以自由决定如何评估表
14 2023-09-15
编程技术问答社区
获取每组分组结果的前N条记录
以下是最简单的示例,尽管任何解决方案都应能够扩展到许多n个顶部结果: 在下面给出类似的表格,带有人,小组和年龄专栏,您将如何获得每个小组中的两个最大的人?(团体内部的联系不应该产生更多的结果,而是给予按字母顺序排列的第2个) +--------+-------+-----+ | Person | Group | Age | +--------+-------+-----+ | Bob | 1 | 32 | | Jill | 1 | 34 | | Shawn | 1 | 42 | | Jake | 2 | 29 | | Paul | 2 | 36 | | Laura | 2 | 39 | +--------+-------+-----+ 所需结果集: +--------+-------+-----+ | Shawn | 1 | 42 | | Jill | 1 |
18 2023-09-15
编程技术问答社区
按类别划分的前10名 mysql
我有一张表,必须根据该类别中的人花费的数量在每个类别中获得前十名.我的样本数据是 person category amount roger perfume 20 jim perfume 50 joe tv 5 jim tv 25 kathy car 40 alicia perfume 100 我必须在一个查询中得到这个.我知道限制在数量上不起作用 限制量10 .请帮助 解决方案 使用变量: SELECT person, category, amount FROM ( SELECT person, category, amount, @rn := IF(@cat = category, @rn+1, IF(@cat := category, 1, 1)) AS rn FROM mytable CROSS JOIN (SELEC
40 2023-06-25
编程技术问答社区
在选择中定义一个变量并在同一个选择中使用它
有可能做这样的事情吗? SELECT @z:=SUM(item), 2*@z FROM TableA; 我总是为第二列的零.奇怪的是,在做 之类的事情时 SELECT @z:=someProcedure(item), 2*@z FROM TableA; 一切都按预期工作.为什么? 解决方案 mysql 文档 P> 作为一般规则,您切勿将值分配给用户变量 并在同一语句中读取值.你可能会得到 您期望的结果,但这不能保证.的顺序 评估涉及用户变量的表达式未定义,并且 可以根据给定语句中包含的元素进行更改; 此外,该顺序不能保证 释放MySQL Server.在select @a,@a:= @a+1,...,您可能可以 认为MySQL将首先评估@A,然后进行作业 第二.但是,更改语句(例如,通过添加一个 组,有或按子句订购)可能会导致mysql选择一个 执行计划具有不同的评估顺序. 您可以使用子查询做您想做
76 2023-06-25
编程技术问答社区
MySQL。有连续月份的记录数
我已经四处搜索,但是所有类似的问题和答案都足够不同,无法工作. 我有一个带有以下字段的桌子:人,事物,普拉特.当一个人购买每个新事物时,将输入新记录. 我想连续数月一个人购买了任何"东西"(Thing01或Thing02,它不是Mater).如果连续的普遍违反,则计数应重新开始. 随附数据,我想以此为例: | Person | Consec Days | | person_01 | 3 | | person_02 | 3 | | person_02 | 2 | 我知道我可以得到一个独特的人列表,提取(来自purdate的年度_ month) - 我在此 sqlfiddle - 但我不确定如何仅计算连续记录并在休息时间重新开始(例如,在我的数据中,person_02在3月至5月之间休息.) 这是数据: create table records ( person varchar(
22 2023-04-16
编程技术问答社区
根据概率机会选择随机值
如何根据分配给每一行的概率机会从数据库中选择一个随机行. 示例: Make Chance Value ALFA ROMEO 0.0024 20000 AUDI 0.0338 35000 BMW 0.0376 40000 CHEVROLET 0.0087 15000 CITROEN 0.016 15000 ........ 如何根据必须选择的概率选择随机命名及其值. rand()和ORDER BY的组合可以工作吗?如果是这样,最好的方法是什么? 解决方案 您可以使用rand(),然后使用累积总和来执行此操作.假设它们总计100%: select t.* from (select t.*, (@cumep := @cumep + chance) as cumep from t cross join (select @cumep := 0, @r := ra
32 2023-04-13
编程技术问答社区
结合两列的条件 mysql
我想从2个不同的列中结合我的查询条件.这是我的原始查询.您可以在sqlfiddle.com中进行测试. -- creating database first for test data create table attendance(Id int, DateTime datetime, Door char(20)); INSERT INTO attendance VALUES ( 1, '2016-01-01 08:00:00', 'In'), ( 2, '2016-01-01 09:00:00', 'Out'), ( 3, '2016-01-01 09:15:00', 'In'), ( 4, '2016-01-01 09:30:00', 'In'), ( 5, '2016-01-01 10:00:00', 'Out'), ( 6, '2016-01-01 15:00:00', 'In'); SELECT *
32 2023-04-08
编程技术问答社区
更新表的单列,值应从0开始,然后以1递增。
$sqlcount1 ="SET uid = -1 UPDATE `agent_normal` SET `uid` = @a:=@a+1"; $result = mysqli_query($conn,$sqlcount1); 如何在核心 php 中编写这个查询? 此查询在 mysql 中有效,但在核心 php 中无效. 这里我想更新单行表,值应该从 0 开始,然后增加 1. 解决方案 有几个问题.首先,如果您查看此 answer,您会发现变量名称不正确并且缺少分号.查询应该是: $sqlcount1 ="SET @a = -1; UPDATE `agent_normal` SET `uid` = @a:=@a+1"; 其次,要在一次调用中使用两个查询,您需要使用 mysqli_multi_query. $result = mysqli_multi_query($conn,$sqlcount1);
90 2022-07-31
编程技术问答社区
MySQL-在选择中定义一个变量并在同一选择中使用它
有没有可能做这样的事情? SELECT @z:=SUM(item), 2*@z FROM TableA; 我总是得到第二列的 NULL.奇怪的是,在做类似的事情时 SELECT @z:=someProcedure(item), 2*@z FROM TableA; 一切都按预期进行.为什么? 解决方案 MySQL 文档 对此非常清楚: 作为一般规则,您永远不应该为用户变量赋值并读取同一语句中的值.你可能会得到您期望的结果,但这不能保证.的顺序涉及用户变量的表达式的评估是未定义的,并且可能会根据给定语句中包含的元素而更改;另外,这个顺序不保证在MySQL 服务器的版本.在 SELECT @a, @a:=@a+1, ... 中,您可能认为 MySQL 会先评估 @a 然后做一个赋值第二.但是,更改语句(例如,通过添加GROUP BY、HAVING 或 ORDER BY 子句)可能会导致 MySQL 选择一个具有不同评
1738 2022-07-30
编程技术问答社区