【问题标题】:Mysql SELECT , find number of rows , then INSERT in a single query statementMysql SELECT,查找行数,然后在单个查询语句中插入
【发布时间】:2015-05-18 15:59:38
【问题描述】:


假设我们有收件箱表,一次最多只能接收 50 条消息,为此我使用以下代码:

$maximum_messages_in_inbox = 50;

$query1 = mysql_query("SELECT * from inbox");
if(mysql_num_rows($query1) > $maximum_messages_in_inbox)
{
   echo "Message memmory if full please try again later";
}
else
{
   mysql_query("insert into inbox set text = '$text' , sender = '$sender' ");
}

这段代码运行良好,但每次都会执行两个查询。
我的问题是我们可以在单个查询中调整上述目的吗,例如:

mysql_query("select * from inbox if num > 50 insert else error");
if(error)
{
   echo "Message memmory if full please try again later";
}

期待您的合作。谢谢

【问题讨论】:

  • 仅供参考,您正在使用已弃用的 mysql_ 函数,这可能会导致 sql 注入的风险。出于安全考虑,您可能需要查看 mysqli_PDO
  • 了解prepared statements,并考虑使用PDO,it's not as hard as you think
  • 亲爱的我使用mysqli 而不是mysql 但只是为了询问目的我使用mysql,无论如何感谢您的建议。下次我会用mysqli询问
  • 但是@JayBlanchard 我觉得我真的很难:(

标签: php mysql mysqli


【解决方案1】:

你可以用这个技巧在 SQL 中做条件INSERT

INSERT INTO inbox(text, sender)
SELECT 'text value', 'sender value'
FROM dual
WHERE (SELECT COUNT(*) FROM inbox) < 50;

只有在满足WHERE 子句的情况下才会处理INSERT

【讨论】:

  • 谢谢,我正在尝试,但请告诉我您在mysql_query 中使用了dual 字,它是table_namekeyword @vard
  • dual 是一个虚拟表名。见dev.mysql.com/doc/refman/5.0/en/select.html所以不需要创建一个名为dual的表
  • 我一直很想知道foo是什么?是什么的假名吗?
  • 非常感谢@vard,我试过了,效果很好,一开始我使用相同的表名而不是dual 然后我遇到了一个新问题,但后来我尝试了dual 和它工作得很好,我的问题解决了非常感谢你
猜你喜欢
  • 1970-01-01
  • 2016-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-05
相关资源
最近更新 更多