MySQL:查找数据库和数组中值之间的存在

时间:2015-02-09 12:14:54

标签: mysql arrays comparison updates

我想知道如何创建一个唯一的查询来查找哪些值存在以及哪些值不存在。我解释一下。

我拥有什么

我有一个数据库表,其结构如下:

+----+--------+-----------+-----------+
| 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“属性”,但不能将其复制到与另一个{{1 }}

问题

当我想更新操作中的按钮时,问题就出现了。我收到一个type对象,其中包含一个按钮数组(在PHP中),结构如下(我用JSON结构编写):

action

正如您所看到的,ID为1的按钮保持不变,但是我有一个新的按钮来处理(ID为3的按钮),ID 2的按钮不再存在。

我想要什么

我希望能够创建一个唯一的MySQL查询,它会返回我收到的那些值,哪些不存在,哪些值可能存在于数据库中,但不存在于阵列。

总结一下:我想知道收到的数组中的按钮与数据库中的按钮之间的差异。

所以,作为一个例子以及之前描述的数据和我们现在拥有的数据库,我希望收到这样的内容:

"buttons":
    [
       {
          "id":"1",
          "type":"button"
       },
       {
          "id":"3",
          "type":"attribute"
       }
    ]

有了这些信息,我就能知道那个ID为2的按钮不再存在(因为它在新数组中不存在),而ID为3的按钮是一个新按钮,因为它以前不存在,但它存在于新数组中。

我尝试了什么

我尝试过一些测试,但是没有一个测试能够满足我的需求,而且不仅仅是使用MySQL纯查询进行测试。

例如,我试图检查我收到的每个按钮是否存在,但这样就不会发现按钮是否被删除(因此它不存在于接收到的数组中)。

检查但作为参考,数据库中的按钮具有相同的效果,因为我将能够检查哪些已更新或删除,但它将跳过那些新的并且不存在于数据库中。

我尝试编写一些查询+--------+-----------+--------+------------+ | action | button_id | exists | is_present | +--------+-----------+--------+------------+ | 1 | 1 | 1 | 1 | | 1 | 2 | 1 | 0 | | 1 | 3 | 0 | 1 | +--------+-----------+--------+------------+ 查询和COUNT button_id等等,但是没有运气。

(我不会写查询,因为他们都没有给我预期的结果,所以他们对你没有任何帮助。)

我认为之前解释过的任何组合都会比纯数据库查询要慢得多,这就是我要求它的原因。

问题

是否有一个查询会返回给我类似之前在“我想要的内容”部分中解释的响应,因此只调用MySQL服务器

感谢您的所有时间,您的回复以及您对我可能发现的任何缺乏信息的耐心。

当然,您有任何疑问,疑问或可能需要的信息,请对其进行评论,我会尝试更好地解释或添加它。

亲切的问候。

1 个答案:

答案 0 :(得分:1)

在单个查询中执行此操作将非常简单。这是一个解决方案,它不是您正在寻找的,但应该完成这项工作。

假设您的表格如下:

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);

现在我们需要根据您对特定操作的按钮/属性更新表。

-- 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。请注意,我必须将UPDATEINSERT放在左侧面板中,因为查询面板中不允许使用DML。