小编Qua*_*noi的帖子

获取MySQL中的表的行数?

任何人都可以告诉我,在查找表的行数时,MySQL中哪个是更好的appraoch:是否更好做

SELECT COUNT(*) FROM TABLE_NAME
Run Code Online (Sandbox Code Playgroud)

或者查找表TABLE中的行数INFORMATION_SCHEMA

这是计算页面分页计数的常用操作吗?

我应该补充说,表最多只有几千行.

谢谢

马丁奥谢.

mysql sql row count

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

MYSQL - 检索日期之间的时间戳

所有,

我有一个MYSQL表,其中包含一个名为timestamp的列.它是DATETIME数据类型,其值类似于"10/1/2009 3:25:08 PM',"10/1/2009 3:30:05 PM',"10/4/2009 3:40:01 PM',等等..

我想编写一个SQL查询来选择两个日期之间的时间戳字段中的所有值.这样的事情:

select timestamp from tablename where timestamp >= userStartDate and timestamp <= userEndDate
Run Code Online (Sandbox Code Playgroud)

userInput日期没有时间部分.你能为此建议正确的MySQL查询语法吗?谢谢

mysql sql datetime

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

删除不同的行

我有一个具有唯一非聚集索引的表,并且此索引中列出了4个列.我想更新表中的大量行.如果我这样做,它们将不再是不同的,因此更新因索引而失败.

我想要禁用索引,然后删除最旧的重复行.到目前为止,这是我的查询:

SELECT t.itemid, t.fieldid, t.version, updated
FROM dbo.VersionedFields w
inner JOIN
(
    SELECT itemid, fieldid, version, COUNT(*) AS QTY
    FROM dbo.VersionedFields
    GROUP BY itemid, fieldid, version
    HAVING COUNT(*) > 1
) t 
on w.itemid = t.itemid and w.fieldid = t.fieldid and w.version = t.version
Run Code Online (Sandbox Code Playgroud)

内部联接内部的选择返回我们想要删除的正确数量的记录,但是对它们进行分组,实际上是实际数量的两倍.

加入后它会显示所有记录,但我想要删除的是最早的记录吗?

如何才能做到这一点?

sql sql-server greatest-n-per-group

7
推荐指数
1
解决办法
4574
查看次数

如何有效地删除Postgresql 8.1表中的行?

我正在研究PostgreSQL 8.1 SQL脚本,它需要从表中删除大量行.

假设我需要删除的表是Employees(~260K行).它的主键名为id.

我需要从此表中删除的行存储在一个名为EmployeesToDelete(~10K记录)的单独临时表中,其中包含一个名为employee_id的Employees.id的外键引用.

有没有一种有效的方法来做到这一点?

起初,我想到了以下几点:

DELETE
FROM    Employees
WHERE   id IN
        (
        SELECT  employee_id
        FROM    EmployeesToDelete
        )
Run Code Online (Sandbox Code Playgroud)

但我听说使用"IN"子句和子查询可能效率低下,尤其是对于较大的表.

我查看了PostgreSQL 8.1文档,并提到了DELETE FROM ... USING但它没有示例,所以我不知道如何使用它.

我想知道以下是否有效并且效率更高?

DELETE
FROM    Employees
USING   Employees e
INNER JOIN
        EmployeesToDelete ed
ON      e.id = ed.employee_id
Run Code Online (Sandbox Code Playgroud)

非常感谢您的意见.

编辑:我运行了EXPLAIN ANALYZE,奇怪的是第一个DELETE跑得很快(几秒钟内),而第二个DELETE花了这么长时间(超过20分钟)我最终取消了它.

向临时表添加索引有助于提高性能.

这是对任何感兴趣的人的第一个DELETE的查询计划:

 Hash Join  (cost=184.64..7854.69 rows=256482 width=6) (actual time=54.089..660.788 rows=27295 loops=1)
   Hash Cond: ("outer".id = "inner".employee_id)
   ->  Seq Scan on Employees  (cost=0.00..3822.82 rows=256482 width=10) (actual time=15.218..351.978 rows=256482 loops=1)
   ->  Hash  (cost=184.14..184.14 rows=200 width=4) (actual time=38.807..38.807 rows=10731 loops=1) …
Run Code Online (Sandbox Code Playgroud)

sql database postgresql

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

如何在表格中获得第一个未使用的ID?

我必须编写一个查询,其中我需要ID为特定记录分配一个(唯一密钥),该记录未被使用/未被生成/在数据库中不存在.

简而言之,我需要id为特定记录生成一个并在打印屏幕上显示它.

E. g.:

ID  Name

1   abc
2   def
5   ghi

所以,问题是它应该ID=3作为尚未生成的下一个立即返回,并且在这一代之后id,我将把这些数据存储回数据库表.

它不是一个硬件:我正在做一个项目,我有一个要求,我需要编写这个查询,所以我需要一些帮助来实现这一目标.

所以请指导我如何进行此查询,或如何实现此目的.

谢谢.

我无法添加评论,这就是为什么我在这里写我的评论..我使用MySQL作为数据库..

我的步骤是这样的: -

1)从数据库表中检索未使用的id.

2)因为他们不是.用户(基于网站的项目),所以我不想发生并发,所以如果一个用户生成一个ID,那么它应该锁定数据库,直到同一个用户收到id并存储该id的记录.之后,其他用户可以检索不存在的ID.(主要要求)..

我怎么能在MySQL中实现所有这些东西,而且我认为Quassnoi的答案是值得的,但它不适用于MySQL ..所以plz解释有关查询的一点,因为它对我来说是新的..并且这个查询工作在MySQL ..

mysql sql

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

计算两个日期之间的缺失日期范围和重叠日期范围

我在我的数据库中有以下日期(dd/MM/yyyy)匹配事件:

eventId     startDate     endDate
1           02/05/2009    10/05/2009
2           08/05/2009    12/05/2009
3           10/05/2009    12/05/2009
4           21/05/2009    21/05/2009
5           25/05/2009    NULL
6           01/06/2009    03/06/2009

事件具有开始和结束日期(时间无关紧要),NULL endDate表示事件仍在进行中.

我想确定的是两个任意日期之间的日期范围,其中a)没有事件,b)事件是重叠的.

因此,对于输入日期范围01/04/2009 - 30/06/2009,我希望得到以下结果:

no event: 01/04/2009 - 01/05/2009
overlap : 08/05/2009 - 10/05/2009
overlap : 10/05/2009 - 12/05/2009
no event: 13/05/2009 - 20/05/2009
no event: 22/05/2009 - 24/05/2009
overlap : 01/06/2009 - 03/06/2009

注意,作为一个结果,两个相邻的重叠范围是可接受的.

任何人都可以帮我用SQL算法来生成这个结果集吗?

编辑:目标平台数据库是SQL Server 2005.日期记录为10/05/2009 00:00:00,这意味着该事件在10/5/2009 00:00:00和10/5之间的某个时间结束2009 23:59:59 开始日期也是如此.因此,输入日期范围也可以读作01/04/2009 00:00:00 - 30/06/2009 23:59:59.

sql t-sql sql-server algorithm

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

如何使用逗号分隔的值列表作为T-SQL中的过滤器?

我有一个基本的SQL查询,从以下开始:

SELECT top 20 application_id, [name], location_id FROM apps
Run Code Online (Sandbox Code Playgroud)

现在,我想完成它,以便它这样做(用伪代码编写)

if @lid > 0 then
    WHERE location_id IN (@lid)
else
    WHERE location_id is all values in location_id column
Run Code Online (Sandbox Code Playgroud)

根据要求,这是一个例子

application_id             name               location_id
----------------------------------------------------------
1                          Joe Blogs          33
2                          Sam Smith          234
3                          Jeremy Carr        33
Run Code Online (Sandbox Code Playgroud)

@locid是用户给出的结果,例如'33,234'

如果@lid为空,那么我希望它输出具有name和application_id的location_id的所有行.否则,我希望它输出与@lid中提供的数字相关的所有行(代表location_id.

所以,如果@lid是0:

application_id             name               location_id
----------------------------------------------------------
1                          Joe Blogs          33
2                          Sam Smith          234
3                          Jeremy Carr        33
Run Code Online (Sandbox Code Playgroud)

否则,如果@lid包含'33'

application_id             name               location_id
----------------------------------------------------------
1                          Joe Blogs          33
3                          Jeremy Carr        33
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server

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

视图和SELECT查询之间的区别

如果视图用于向用户显示选定的列,则可以使用相同的列

SELECT col1, col2
FROM   xyz
Run Code Online (Sandbox Code Playgroud)

,使用视图有什么意义?

sql view

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

Sql Server中的标量Max

如何在Sql server中实现标量MAX(如Math.Max).(在本质上我想实现类似Max(表达式,0)的东西,使负值替换为0.)

我已经在其他线程中看到了解决方案

  • 创建标量函数(性能如何?)
  • 表达式> 0时表达式ELSE 0) (那么"表达式"被评估两次?)
  • Max(聚合)的复杂用法.

什么是最好的?为什么Sql Server没有这样内置的东西?我看不到任何并发症?

sql sql-server

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

带有独占锁定的MySQL InnoDB死锁(FOR UPDATE)

我这样做是为了确保只运行一次这个进程的实例(伪代码php/mysql innodb):

START TRANSACTION
$rpid = SELECT `value` FROM locks WHERE name = "lock_name" FOR UPDATE
$pid = posix_getpid();
if($rpid > 0){
  $isRunning = posix_kill($rpid, 0);
  if(!$isRunning){ // isRunning
    INSERT INTO locks values('lock_name', $pid) ON DUPLICATE KEY UPDATE `value` = VALUES(`value`)
  }else{
    ROLLBACK
    echo "Allready running...\n";
    exit();
  }
}else{ // if rpid == 0 -
  INSERT INTO locks values('lock_name', $pid) ON DUPLICATE KEY UPDATE `value` = VALUES(`value`)
}
COMMIT

...............

//free the pid
INSERT INTO locks values('lock_name', 0) ON DUPLICATE …
Run Code Online (Sandbox Code Playgroud)

mysql deadlock innodb transactions

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