【问题标题】:Mysql Comparison in where clauses between two subqueriesMysql比较两个子查询之间的where子句
【发布时间】:2013-11-17 18:49:12
【问题描述】:

有没有什么办法,使用Mysql,在insert语句的where子句中比较两个子查询的结果?

这是我正在尝试做的一个示例。

insert into table1 (field1, field2) values (....) where (select sum(x) from table2 where ..) <= (select sum(y) from table3 where ..)

在本例中,我们假设 x 和 y 是数值。

感谢您的帮助

【问题讨论】:

  • MySql 有INSERT-SELECT 构造。你到底想达到什么目的?
  • +1 到 @PM77-1,因为 INSERT 不允许 WHERE 子句。无法猜测您打算使用此语句做什么。你能描述一下吗?
  • 如果满足条件,您打算插入哪些值?它们是您在 SQL 中提供的文字值,还是取自 table2table3
  • @Bill Karwin:你是对的。好久没用sql了,不记得insert不允许where子句了……我想做的是只有满足条件才插入一行。就我而言,如果某个位置没有订满,我想添加预订。
  • @eggyal : 值来自用户,因此它们是文字。

标签: mysql sql comparison subquery


【解决方案1】:

可以使用INSERT ... SELECT:

INSERT INTO table1 (field1, field2) SELECT ?, ?
WHERE (SELECT SUM(x) FROM table2 WHERE ..) <= (SELECT SUM(y) FROM table3 WHERE ..)

但这个逻辑确实看起来很奇怪,可能表明设计不佳。

【讨论】:

  • 我认为这是解决方案,但也许它的设计很糟糕。这里我的两个简化表只包含有趣的字段。 Location (id, name, maxNumberOfPeople), Reservation (id, name, locationId, numberOfPeople) 在接受预订之前,我想检查所选位置是否有足够的空间容纳预订者。在这种情况下你会怎么做?
  • @Keen:通常会使用数据库transaction,从表中读取数据,验证数据库的当前状态是否支持所需的更改,然后提交该更改到数据库;如果正确完成,这样的操作将从任何其他数据库连接的角度“原子地”执行,从而避免不一致的数据。
  • 就是这样。我想避免不一致的数据,但我必须只使用 sql 查询来执行操作。该案例是在学校练习的背景下,所以我不能使用数据库事务。不过下次我会记住的。
【解决方案2】:

我想:

SELECT @sum_x:=sum(x)FROM table2 WHERE ..
SELECT @sum_y:=sum(x)FROM table3 WHERE ..
INSERT INTO table1 (field1, field2) SELECT *(what do you want) FROM ???? WHERE  @sum_x ??? @sum_y 
// Do not know what are you trying to insert actually and on what condition

看看join操作。 Join 我认为您需要将table2和table3连接起来,然后进行比较和选择。可能会对您的设计有所帮助。

【讨论】:

  • 问题是你的条件没用。我想你打算加入表格,否则你的条件可以是真/假,它不会依赖于第一张桌子。你实际得到的是:1)复制所有内容(我现在不复制)2)什么都不复制。
猜你喜欢
  • 2021-10-09
  • 2018-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多