MySQL: 查找数据库和数组中值之间的存在
MySQL: Finding existences between values in database and array
我想知道如何进行唯一查询以找出哪些值存在,哪些值不存在。我解释一下。
我有什么
我有一个数据库table,其结构如下:
+----+--------+-----------+-----------+
| id | action | button_id | type |
+----+--------+-----------+-----------+
| 1 | 1 | 1 | button |
| 2 | 2 | 4 | button |
| 3 | 1 | 2 | attribute |
+----+--------+-----------+-----------+
如您所见,一个 action
可以有多个 button_id
值。据您所知,一个 button_id
也可以分配给多个 action
,但是一个 button_id
只能有一个 type
作为一个动作。
因此,button_id
1 也可以出现在 action
4 中,并设置了 type
"attribute",但不能将其复制到相同的操作中另一个 type
.
问题
当我想更新操作中的按钮时,问题就来了。我收到一个 action
对象,它有一个按钮数组(在 PHP 中),结构如下(我将其写在 JSON 结构中):
"buttons":
[
{
"id":"1",
"type":"button"
},
{
"id":"3",
"type":"attribute"
}
]
如您所见,ID 1 的按钮保持不变,但我有一个新按钮要处理(ID 3 的按钮)并且 ID 2 的按钮不再存在。
我想要什么
我希望能够创建一个唯一的MySQL查询,return告诉我哪些值存在,哪些值存在不,并且可能存在于数据库中但不存在于该数组中。
总结一下:我想知道接收到的数组中的按钮与数据库中存在的按钮之间的区别。
因此,作为示例,使用之前描述的接收数据和我们现在拥有的数据库,我希望收到像这样:
+--------+-----------+--------+------------+
| action | button_id | exists | is_present |
+--------+-----------+--------+------------+
| 1 | 1 | 1 | 1 |
| 1 | 2 | 1 | 0 |
| 1 | 3 | 0 | 1 |
+--------+-----------+--------+------------+
根据此信息,我可以知道 ID 为 2 的按钮不再存在(因为它不存在于新数组中)和 ID 为 3 的按钮是一个新按钮,因为它以前不存在,但它存在于新数组中。
我试过的
我已经尝试了一些测试,但其中 none 满足了我的需求,而且不仅使用 MySQL 纯查询进行了测试。
例如,我试图检查我收到的每个按钮是否存在,但这会让我无法找到按钮是否被删除(因此它不存在于接收到的数组中)。
检查但将数据库中的按钮作为参考具有相同的效果,因为我将能够检查哪些已被更新或删除,但它会跳过那些新的和不存在于数据库中的按钮。
我试着写了一些查询 COUNT
查询和 GROUP BY
button_id,等等,但都没有成功。
(我就不写查询了,因为其中none个已经给了我预期的结果,所以对你没有任何帮助)。
我认为之前解释的任何组合都比纯粹通过数据库查询慢得多,这就是我要求它的原因。
问题
是否有一个查询 return 对我来说类似于之前在 "What I'd want" 部分中解释的响应,所以它 只会调用 MySQL 服务器?
感谢大家的宝贵时间、回复和耐心等待我可能发现的任何信息不足。
当然有任何疑惑、疑问或需要的信息,请评论,我会尽力解释或补充。
亲切的问候。
在单个查询中执行此操作会非常麻烦。这是一个不完全是您正在寻找的解决方案,但应该可以完成工作。
假设您的 table 看起来像这样:
CREATE TABLE htmlComponent
(
id int auto_increment primary key,
action int,
button_id int not null,
type varchar(20),
dtInserted datetime,
dtUpdated datetime
);
CREATE UNIQUE INDEX buttonType ON htmlComponent(button_id, type);
现在我们需要根据您对特定操作的按钮/属性更新 table。
-- Reset dtInserted and dtUpdated for action 1
UPDATE htmlComponent SET dtInserted = null, dtUpdated = null WHERE action=1;
-- INSERT or UPDATE according to the data inside the json structure
INSERT INTO htmlComponent (action, button_id, type, dtInserted)
VALUES
(1, 1, 'button', NOW()),
(1, 3, 'attribute', NOW())
ON DUPLICATE KEY UPDATE
button_id = VALUES(button_id),
type = VALUES(type),
dtInserted = null,
dtUpdated = NOW();
-- Getting the result
SELECT * FROM htmlComponent where action=1;
您最终应该得到这个结果,这样可以很容易地找出什么不再存在、什么是新的以及什么已更新。
+----+--------+-----------+-----------+----------------------------+----------------------------+
| ID | ACTION | BUTTON_ID | TYPE | DTINSERTED | DTUPDATED |
+----+--------+-----------+-----------+----------------------------+----------------------------+
| 1 | 1 | 1 | button | (null) | February, 09 2015 16:21:49 |
| 3 | 1 | 2 | attribute | (null) | (null) |
| 4 | 1 | 3 | attribute | February, 09 2015 16:21:49 | (null) |
+----+--------+-----------+-----------+----------------------------+----------------------------+
这是一个fiddle。请注意,我必须将 UPDATE
和 INSERT
放在左侧面板中,因为查询面板中不允许使用 DML。
我想知道如何进行唯一查询以找出哪些值存在,哪些值不存在。我解释一下。
我有什么
我有一个数据库table,其结构如下:
+----+--------+-----------+-----------+
| id | action | button_id | type |
+----+--------+-----------+-----------+
| 1 | 1 | 1 | button |
| 2 | 2 | 4 | button |
| 3 | 1 | 2 | attribute |
+----+--------+-----------+-----------+
如您所见,一个 action
可以有多个 button_id
值。据您所知,一个 button_id
也可以分配给多个 action
,但是一个 button_id
只能有一个 type
作为一个动作。
因此,button_id
1 也可以出现在 action
4 中,并设置了 type
"attribute",但不能将其复制到相同的操作中另一个 type
.
问题
当我想更新操作中的按钮时,问题就来了。我收到一个 action
对象,它有一个按钮数组(在 PHP 中),结构如下(我将其写在 JSON 结构中):
"buttons":
[
{
"id":"1",
"type":"button"
},
{
"id":"3",
"type":"attribute"
}
]
如您所见,ID 1 的按钮保持不变,但我有一个新按钮要处理(ID 3 的按钮)并且 ID 2 的按钮不再存在。
我想要什么
我希望能够创建一个唯一的MySQL查询,return告诉我哪些值存在,哪些值存在不,并且可能存在于数据库中但不存在于该数组中。
总结一下:我想知道接收到的数组中的按钮与数据库中存在的按钮之间的区别。
因此,作为示例,使用之前描述的接收数据和我们现在拥有的数据库,我希望收到像这样:
+--------+-----------+--------+------------+
| action | button_id | exists | is_present |
+--------+-----------+--------+------------+
| 1 | 1 | 1 | 1 |
| 1 | 2 | 1 | 0 |
| 1 | 3 | 0 | 1 |
+--------+-----------+--------+------------+
根据此信息,我可以知道 ID 为 2 的按钮不再存在(因为它不存在于新数组中)和 ID 为 3 的按钮是一个新按钮,因为它以前不存在,但它存在于新数组中。
我试过的
我已经尝试了一些测试,但其中 none 满足了我的需求,而且不仅使用 MySQL 纯查询进行了测试。
例如,我试图检查我收到的每个按钮是否存在,但这会让我无法找到按钮是否被删除(因此它不存在于接收到的数组中)。
检查但将数据库中的按钮作为参考具有相同的效果,因为我将能够检查哪些已被更新或删除,但它会跳过那些新的和不存在于数据库中的按钮。
我试着写了一些查询 COUNT
查询和 GROUP BY
button_id,等等,但都没有成功。
(我就不写查询了,因为其中none个已经给了我预期的结果,所以对你没有任何帮助)。
我认为之前解释的任何组合都比纯粹通过数据库查询慢得多,这就是我要求它的原因。
问题
是否有一个查询 return 对我来说类似于之前在 "What I'd want" 部分中解释的响应,所以它 只会调用 MySQL 服务器?
感谢大家的宝贵时间、回复和耐心等待我可能发现的任何信息不足。
当然有任何疑惑、疑问或需要的信息,请评论,我会尽力解释或补充。
亲切的问候。
在单个查询中执行此操作会非常麻烦。这是一个不完全是您正在寻找的解决方案,但应该可以完成工作。
假设您的 table 看起来像这样:
CREATE TABLE htmlComponent
(
id int auto_increment primary key,
action int,
button_id int not null,
type varchar(20),
dtInserted datetime,
dtUpdated datetime
);
CREATE UNIQUE INDEX buttonType ON htmlComponent(button_id, type);
现在我们需要根据您对特定操作的按钮/属性更新 table。
-- Reset dtInserted and dtUpdated for action 1
UPDATE htmlComponent SET dtInserted = null, dtUpdated = null WHERE action=1;
-- INSERT or UPDATE according to the data inside the json structure
INSERT INTO htmlComponent (action, button_id, type, dtInserted)
VALUES
(1, 1, 'button', NOW()),
(1, 3, 'attribute', NOW())
ON DUPLICATE KEY UPDATE
button_id = VALUES(button_id),
type = VALUES(type),
dtInserted = null,
dtUpdated = NOW();
-- Getting the result
SELECT * FROM htmlComponent where action=1;
您最终应该得到这个结果,这样可以很容易地找出什么不再存在、什么是新的以及什么已更新。
+----+--------+-----------+-----------+----------------------------+----------------------------+
| ID | ACTION | BUTTON_ID | TYPE | DTINSERTED | DTUPDATED |
+----+--------+-----------+-----------+----------------------------+----------------------------+
| 1 | 1 | 1 | button | (null) | February, 09 2015 16:21:49 |
| 3 | 1 | 2 | attribute | (null) | (null) |
| 4 | 1 | 3 | attribute | February, 09 2015 16:21:49 | (null) |
+----+--------+-----------+-----------+----------------------------+----------------------------+
这是一个fiddle。请注意,我必须将 UPDATE
和 INSERT
放在左侧面板中,因为查询面板中不允许使用 DML。