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

MySQL中如何通过多属性选择记录,mysql,Mysql,我不是后端程序员,但我需要解决这个问题。对我来说,这比一开始看起来要复杂得多 我有一些链接的SQL表: 表1 表2 表3 如何从属性权重小于80且类型为手动的工具表中选择所有记录 权重等属性存储在表格属性中,其值存储在表格属性值中见下文: SELECT * FROM tools WHERE id IN( SELECT tool_id FROM attributes a INNER JOIN attribute_values av WHERE a.name = 'weight'

我不是后端程序员,但我需要解决这个问题。对我来说,这比一开始看起来要复杂得多

我有一些链接的SQL表:

表1

表2

表3

如何从属性权重小于80且类型为手动的工具表中选择所有记录

权重等属性存储在表格属性中,其值存储在表格属性值中

见下文:

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'
);
你的类型会带来一个问题。你不可能为每件事做一件事。您应该考虑创建一个更好的模式来存储您的用例数据。或者键入cast,但这将是一个性能上的成功


此外,这被称为an,在大多数情况下不应该使用它——事实上,我发现很少有情况需要使用这样的模型。它很快就会变得一团糟,MySQL不是用于它的数据存储。使用基于行的建模。

关于如何进行简单的SQL select查询,网上有很多教程。如果很简单,您能给出一个代码片段吗?您希望权重如何小于80?您有一个名为name的列,其ID属性存储在表属性中,其值存储在表属性值中。我认为您的表属性值会产生问题。因为它包含的valuesvalue可能是VARCHAR,所以您可以检查attr_id=2和type='manual',但不能检查weight,因为它是VARCHAR。因此,如果MYSQL允许,您需要将表结构或类型转换为attr_id 1上的INT值!这个和av.value<80如何工作,它是一个VARCHAR?此外,如果SQL语法中有错误,则会引发错误;检查与您的MySQL服务器版本对应的手册,以了解在第6行的“从工具中选择*id,从属性a内部JOI中选择工具中的id”附近使用的正确语法!这太慢了——在大约5000条记录的表工具中,我们需要花费2分钟以上的时间来转换数据类型,并在设计糟糕的模式上进行搜索。一切都对我们不利。最好的做法是重做模式,并为性能应用适当的索引。然后,我们可以编写一个更优化的查询来检索数据。我给了你一个解决问题的方法。不幸的是,您的问题不仅仅是能够编写MySQL查询。
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');
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');
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'
);