Php 将X和Y插入到尚不存在的MySQL数据库中
我有一个网格的基本数据库表Php 将X和Y插入到尚不存在的MySQL数据库中,php,mysql,Php,Mysql,我有一个网格的基本数据库表 CREATE TABLE `grid` ( `id` int(10) unsigned NOT NULL, `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `customers_id` int(10) unsigned NOT NULL, `x` int(11) NOT NULL, `y` int(11) NOT NULL,
CREATE TABLE `grid` (
`id` int(10) unsigned NOT NULL,
`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`customers_id` int(10) unsigned NOT NULL,
`x` int(11) NOT NULL,
`y` int(11) NOT NULL,
`seen` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
我试图从网格中获取一个x和y值,而这个值在网格中并不存在。(稍后将其用作插入的一部分)我使用以下命令,但有时,它会返回一组已经存在的坐标
PHP
MySQL(在PHP中用引号括起来-因此在变量周围用花括号括起来)
非常感谢您的帮助 它返回现有值,因为过滤器完全错误:
WHERE 'random' NOT IN (
SELECT CONCAT( `x`, '-', `y` ) FROM `grid`
在where条件中,将字符串literal'random'
与永远不会返回此值的子查询进行比较。在where子句中,无法对计算字段进行筛选,因为select列表是在where子句之后计算的。您只能筛选having子句中的此类字段,并删除单词random周围的话语标记:
SELECT
CONCAT(
FLOOR( (RAND() * ( {$this->_maxColumns} - 1 + 1 ) ) + 1 ),
'-',
FLOOR( (RAND() * ( {$this->_maxRows} - 1 + 1 ) ) + 1 )
) as random
FROM `grid`
HAVING random NOT IN (
SELECT CONCAT( `x`, '-', `y` ) FROM `grid`
)
但是,上面的查询可能根本不会返回任何行。我宁愿生成一个范围内不存在的坐标列表,然后随机选择其中一个。我会有一个包含所有可能的x-y对的帮助表,只需在where条件中使用is null在网格表上进行左连接,然后使用
order by rand()limit 1
,或者从php中进行随机选择。它返回现有值,因为过滤器完全错误:
WHERE 'random' NOT IN (
SELECT CONCAT( `x`, '-', `y` ) FROM `grid`
在where条件中,将字符串literal'random'
与永远不会返回此值的子查询进行比较。在where子句中,无法对计算字段进行筛选,因为select列表是在where子句之后计算的。您只能筛选having子句中的此类字段,并删除单词random周围的话语标记:
SELECT
CONCAT(
FLOOR( (RAND() * ( {$this->_maxColumns} - 1 + 1 ) ) + 1 ),
'-',
FLOOR( (RAND() * ( {$this->_maxRows} - 1 + 1 ) ) + 1 )
) as random
FROM `grid`
HAVING random NOT IN (
SELECT CONCAT( `x`, '-', `y` ) FROM `grid`
)
但是,上面的查询可能根本不会返回任何行。我宁愿生成一个范围内不存在的坐标列表,然后随机选择其中一个。我会有一个包含所有可能的x-y对的帮助表,只需在where条件中使用is null在网格表上进行左连接,然后使用
order by rand()limit 1
,或者从php中进行随机选择。如果您完成了查询之外的所有数学运算,您可以编写一个更简单的。这将是一个简单的选择,只需一个where=我建议在PHP中随机选择x和y,并用SELECT检查表中是否存在该值。重复do-while()中的操作,直到该值不在表中为止。@WilliamPerron您提出该建议的根本原因是什么?大多数(如果不是全部的话)数据库完全能够在插入之前检查值@Mike,您可以使用IF NOT EXIST()
,NOT IN
,或者执行左连接
,其中不存在的值等于NULL
@xORIFSE,因为在我看来,这样实现起来更简单,而且比查询中的所有值都更可读。但是,是的,它的效率可能更低。如果你做了查询之外的所有数学运算,你可以编写一个简单得多的。这将是一个简单的选择,只需一个where=我建议在PHP中随机选择x和y,并用SELECT检查表中是否存在该值。重复do-while()中的操作,直到该值不在表中为止。@WilliamPerron您提出该建议的根本原因是什么?大多数(如果不是全部的话)数据库完全能够在插入之前检查值@Mike,您可以使用IF NOT EXIST()
,NOT IN
,或者执行左连接
,其中不存在的值等于NULL
@xORIFSE,因为在我看来,这样实现起来更简单,而且比查询中的所有值都更可读。但是是的,它的效率可能更低。