MySQL键值模式,返回结果必须匹配多个键

MySQL key value schema, returning results that must match multiple keys

我正在尝试利用一个简单的键值 innoDB table 构建一个查询,该查询将 return 所有适用的结果

架构:

CREATE TABLE `user_metadata` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int(10) unsigned NOT NULL,
  `key` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  `value` text COLLATE utf8_unicode_ci DEFAULT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `user_metadata_key_index` (`key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

数据:

INSERT INTO
  `user_metadata` (
    `id`,
    `user_id`,
    `key`,
    `value`,
    `created_at`,
    `updated_at`
  )
VALUES
  (1, 1, 'nickname', 'bobby'),
  (2, 1, 'pet', 'dog'),
  (3, 1, 'transport', 'car'),
  (4, 2, 'nickname', 'andy'),
  (5, 2, 'pet', 'dog'),
  (6, 2, 'transport', 'car') (, 3, 'nickname', 'jonny'),
  (7, 3, 'nickname', 'jonno'),
  (8, 3, 'pet', 'cat'),
  (9, 3, 'transport', 'bike')

我提供的数据经过简化,我们的真实数据每个 user_id

使用 20 个不同的唯一键

我想要实现的是 return user_id 宠物 = 狗和运输 = 汽车的所有记录,因此这两个键必须具有基于每个用户的给定值。

在传统的数据库模式中,这将是微不足道的,这种模式设计具有优势,所以我宁愿尽可能不重组模式,但我不确定如何处理这个问题,我应该看看内部选择/内部加入等?

如有任何帮助,我们将不胜感激。

SELECT *
FROM user_metadata
INNER JOIN user_metadata AS subQ
USING(user_id)
WHERE user_metadata.key = 'pet'
AND user_metadata.value = 'dog'
AND subQ.key = 'transport'
AND subQ.value = 'car';`