相关疑难解决方法(0)

MySQL子查询的问题

为什么这个查询

DELETE FROM test 
WHERE id = ( SELECT id 
             FROM (SELECT * FROM test) temp 
             ORDER BY RAND() 
             LIMIT 1
           );
Run Code Online (Sandbox Code Playgroud)

有时删除 1 行,有时删除 2 行,有时什么都不删除?

如果我用这种形式写:

SET @var = ( SELECT id 
             FROM (SELECT * FROM test) temp 
             ORDER BY RAND() 
             LIMIT 1
           ); 
DELETE FROM test 
WHERE id=@var;
Run Code Online (Sandbox Code Playgroud)

那么它可以正常工作 - 子查询有问题吗?

mysql

16
推荐指数
2
解决办法
6805
查看次数

Postgres 中匹配条件的行数上限

假设我有一个像这样的数据库模式

user_id text
photo_id text
date_created timestamp
Run Code Online (Sandbox Code Playgroud)

我想强制执行“一个用户只能拥有 30 张照片”的约束。实现这一点的一个天真的方法是

SELECT COUNT(*) FROM user_photos WHERE user_id='usr_123'
Run Code Online (Sandbox Code Playgroud)

将结果与 30 进行比较,如果较低,则进行插入。天真,因为如果您可以在短时间内触发多个请求,您就可以赢得一场比赛并最终写入 30 多个记录。

有没有办法在数据库中强制执行此约束?例如创建某种索引“只能插入 30 行”,或者什么?有没有办法让一个count列为每个 userId 单独递增,并且可以将其范围限制为0-29

如果您使用事务,会锁定您读取的行吗?

postgresql index constraint

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

如何选择/计算列中存在相同值但不在同一表中的其他列中的行

我有这个表结构和数据:

CREATE TABLE IF NOT EXISTS `default_relations_users` (
  `id_user_rq` int(11) NOT NULL,
  `id_user_ap` int(11) NOT NULL,
  UNIQUE KEY `rusers_rq_ap_idx` (`id_user_rq`,`id_user_ap`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

INSERT INTO `default_relations_users` (`id_user_rq`, `id_user_ap`) VALUES
(1, 2),
(1, 3),
(1, 4),
(2, 1),
(2, 2),
(2, 3);
Run Code Online (Sandbox Code Playgroud)

我只需要获取值在左侧但不在右侧的行,例如:将不会选择 1,2 和 2,1 但 1,3 和 1,4 是。我试试这个查询:

SELECT * FROM default_relations_users
WHERE default_relations_users.id_user_rq = 1 
 AND NOT EXISTS (SELECT id_user_ap FROM default_relations_users WHERE id_user_ap = 1) 
Run Code Online (Sandbox Code Playgroud)

也许我不明白子查询是什么意思,或者我以错误的方式使用。所以有什么帮助吗?

mysql query subquery

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

标签 统计

mysql ×2

constraint ×1

index ×1

postgresql ×1

query ×1

subquery ×1