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