我不是后端程序员,但我需要解决这个问题。对我来说,它比起初看起来更复杂。
我有一些链接的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
答案 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不是用于它的数据存储。请改用基于行的建模。