小编don*_*onk的帖子

如何在 MySQL 存储过程中使用准备好的语句?

我正在使用 mysql,我需要以某种方式使用后面查询中准备好的语句返回的列 curid。我使用准备好的语句,因为正如我所读到的,它是将变量传递给 LIMIT 子句的唯一方法。我在这里有这个存储过程:

DROP PROCEDURE IF EXISTS fixbalance;
CREATE PROCEDURE fixbalance (userid INT)
  BEGIN
  DECLARE i INT DEFAULT 0;
  DECLARE balance INT DEFAULT 0;
  DECLARE idcnt INT;

  SET idcnt = (SELECT COALESCE(COUNT(id), 0) 
               FROM coupon_operations 
               WHERE user_id = userid);
  IF idcnt <> 0 THEN
    WHILE i <= idcnt DO
      BEGIN
        SET @iter = i;
        SET @user_id = userid; 
        SET @sql = CONCAT('SELECT id AS curid 
                           FROM coupon_operations 
                           WHERE user_id = ? 
                           ORDER BY id ASC 
                           LIMIT ?, 1'); …
Run Code Online (Sandbox Code Playgroud)

mysql stored-procedures prepared-statement

18
推荐指数
2
解决办法
5万
查看次数

在按不同表中的列排序时避免使用临时表

所以我在这里有这个 MySQL InnoDB 查询:

SELECT s.vid, s.body, s.timestamp, COUNT(v.id) AS votecnt
FROM stories s
LEFT JOIN votes v ON s.vid = v.vid
WHERE s.lv = 1
AND s.status = 1
GROUP BY s.vid
ORDER BY votecnt DESC
Run Code Online (Sandbox Code Playgroud)

分析显示,运行此查询所需时间的 93% 以上需要复制到结果临时表,以便通过votecnt 进一步排序。可以做些什么来使其更快?

解释输出:

| 1 | 简单 | | 参考 | 最新 | 最新 | 2 | 常量,常量 | 19873 | 使用哪里;使用临时;使用文件排序 |

| 1 | 简单 | v | 参考 | 投票 | 投票 | 4 | sikna_ci.s.vid | 1 …

mysql optimization profiler temporary-tables

6
推荐指数
2
解决办法
1万
查看次数

在 INSERT 中嵌套 SELECT

我正在尝试执行以下操作:

INSERT INTO stories 
   (vid, ip, body, timestamp) 
VALUES (
   (SELECT vid+1 FROM stories ORDER BY vid DESC LIMIT 1), 
   INET_ATON('127.0.0.1'), 
   'test', 
   NOW()
)
Run Code Online (Sandbox Code Playgroud)

但是我在弄清楚如何将 SELECT 语句的返回数据嵌套到 INSERT 语句中时遇到了问题。我需要弄清楚如何获得最高的现有 vid 并将其增加 1。

有任何想法吗?

mysql insert

4
推荐指数
1
解决办法
3111
查看次数