Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将X和Y插入到尚不存在的MySQL数据库中_Php_Mysql - Fatal编程技术网

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=IF NOT EXIST()
NOT IN
,或者执行
左连接
,其中不存在的值等于
NULL
@xORIFSE,因为在我看来,这样实现起来更简单,而且比查询中的所有值都更可读。但是,是的,它的效率可能更低。如果你做了查询之外的所有数学运算,你可以编写一个简单得多的。这将是一个简单的选择,只需一个
where=IF NOT EXIST()
NOT IN
,或者执行
左连接
,其中不存在的值等于
NULL
@xORIFSE,因为在我看来,这样实现起来更简单,而且比查询中的所有值都更可读。但是是的,它的效率可能更低。