我的应用程序读取用户创建的txt文件,包含查询文本,描述,输入和输出,查询类型等。 所以我不能简单地从数据库中获取数据并在java中详细说明(我更先进)。
我有一个spare_parts表,它是通过HEIDI SQL中的CSV导入从excel文件导入的。
这是这样的:
+-------------+---------+---------+---------+---------+---------+ | PART NUMBER | MODEL X | MODEL Y | MODEL Z | MODEL 1 | MODEL 2 | +-------------+---------+---------+---------+---------+---------+ | PART A | 0 | 0 | 1 | 0 | 0 | | PART B | 1 | 0 | 0 | 1 | 0 | | PART C | 1 | 1 | 1 | 0 | 0 | | PART D | 0 | 0 | 0 | 1 | 1 | +-------------+---------+---------+---------+---------+---------+
我需要列出使用某个部件的模型,例如:PART C用于构建模型X,Y和Z.
我不想手动列出所有列,因为它们很多并且因为它们经常更改。
你有什么建议?
答案 0 :(得分:0)
如果我理解正确,您需要多对多关系,因为与每个模型关联的部件数量是不同的。我不知道这个heidisql,但技术必须相同。
基本上,你拥有的是一个零件表
<强>部分:强>
id |名称
另一个模型
id |名称
最后连接前两个表的第三个表
<强> models_to_parts 强>
id | model_id | PART_ID
这些表之间的关系是:
用于检索与模型关联的部件的SQL应如下所示:
SELECT models.name, parts.name FROM models
INNER JOIN models_to_parts ON models.id = models_to_parts.model_id
INNER JOIN parts ON models_to_parts.part_id = parts.id
WHERE models.name = "C" -- or whatever condition you want on model or part
要构建这个多对多表,你需要插入模型,然后插入部分,然后读取两个id以插入连接它们的行。
如果您需要,请查看此处了解更多信息:http://www.tomjewett.com/dbdesign/dbdesign.php?page=manymany.php
答案 1 :(得分:0)
规范您的架构:
CREATE TABLE normalised_parts (
PRIMARY KEY (model, part)
) SELECT 'X' AS model, `PART NUMBER` AS part FROM spare_parts WHERE `MODEL X`
UNION ALL
SELECT 'Y', `PART NUMBER` FROM spare_parts WHERE `MODEL Y`
UNION ALL
SELECT 'Z', `PART NUMBER` FROM spare_parts WHERE `MODEL Z`
UNION ALL
SELECT '1', `PART NUMBER` FROM spare_parts WHERE `MODEL 1`
UNION ALL
SELECT '2', `PART NUMBER` FROM spare_parts WHERE `MODEL 2`
-- etc.
然后你的问题变为:
SELECT model FROM normalised_parts WHERE part = 'PART C'
如果模型列未知/数量众多,您可以从information schema然后prepare and execute创建上述DDL:
SELECT CONCAT('
CREATE TABLE normalised_parts (
PRIMARY KEY (model, part)
) ', GROUP_CONCAT('
SELECT ', QUOTE(COLUMN_NAME), ' AS model, `PART NUMBER` AS part',
' FROM spare_parts WHERE `', REPLACE(COLUMN_NAME, '`', '``'), '`'
SEPARATOR '
UNION ALL'))
INTO @sql
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'spare_parts'
AND COLUMN_NAME LIKE 'MODEL %' -- or whatever is appropriate
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
请注意,您可能需要增加group_concat_max_len
的值,具体取决于列名的总长度。