如何在MySQL中通过多个属性选择记录

时间:2018-03-24 10:22:31

标签: mysql

我不是后端程序员,但我需要解决这个问题。对我来说,它比起初看起来更复杂。

我有一些链接的SQL表:

表1

CREATE TABLE IF NOT EXISTS `tools` (
`id` int(6) unsigned NOT NULL,
`cat` int(6) unsigned NOT NULL,
`name` varchar(200) NOT NULL
) DEFAULT CHARSET=utf8;

INSERT INTO `tools` (`id`, `cat`, `name`) VALUES
('1', '17', 'jackhammer 70'),
('2', '17', 'jackhammer 75'),
('3', '17', 'jackhammer 90');

表2

CREATE TABLE IF NOT EXISTS attributes (
    id int(6) unsigned NOT NULL,
    `name` varchar(200) NOT NULL,
    PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;

INSERT INTO `attributes` (`id`, `name`) VALUES
('1', 'weight'),
('2', 'type'),
('3', 'model');

表3

CREATE TABLE IF NOT EXISTS `attribute_values` (
`attr_id` int(6) unsigned NOT NULL,
`tool_id` int(6) unsigned NOT NULL,
`value` varchar(200) NOT NULL
) DEFAULT CHARSET=utf8;

INSERT INTO `attribute_values` (`attr_id`, `tool_id`, `value`) VALUES
('1', '1', '70'),
('2', '1', 'manual'),
('3', '1', 'ABC'),
('1', '2', '75'),
('2', '2', 'manual'),
('3', '2', 'DEF'),
('1', '3', '90'),
('2', '3', 'automatic'),
('3', '3', 'HIG');

http://sqlfiddle.com/#!9/0bfd368/1

如何从tools表中选择属性weight小于80且type为手动的所有记录。

weight等属性存储在表格属性及其值attribute_values

1 个答案:

答案 0 :(得分:0)

见下文:

SELECT * FROM tools 
WHERE id IN(
  SELECT tool_id FROM attributes a
  INNER JOIN attribute_values av
  WHERE a.name = 'weight'
  AND CAST(av.value AS UNSIGNED) < 80
) 
AND id IN(
  SELECT tool_id FROM attributes a
  INNER JOIN attribute_values av
  WHERE a.name = 'type'
  AND av.value = 'manual'
);

您的类型会出现问题。你无法为一切做varchar。您应该考虑制作更好的架构来存储您的用例数据。或者输入,但这将会影响性能。

此外,这被称为EAV data model,在大多数情况下不应该使用 - 实际上我发现很少有案例需要使用这种模型。它变得很乱,MySQL不是用于它的数据存储。请改用基于行的建模。