1

我的应用程序读取用户创建的 txt 文件,其中包含查询文本、描述、输入和输出、查询类型等。所以我不能让从数据库中获取数据并在 java 中详细说明它们变得更容易(我'米更先进)。

我有一个备用零件表,它是通过 HEIDI SQL 中的 CSV 导入从 excel 文件导入的。

它是这样制作的:

+-------------+---------+----------+---------+----- ----+----------+
| 零件编号 | X 型 | 型号 Y | Z 型 | 模型 1 | 型号 2 |
+-------------+---------+----------+---------+----- ----+----------+
| A部分| 0 | 0 | 1 | 0 | 0 |
| B 部分 | 1 | 0 | 0 | 1 | 0 |
| C部分| 1 | 1 | 1 | 0 | 0 |
| D部分| 0 | 0 | 0 | 1 | 1 |
+-------------+---------+----------+---------+----- ----+----------+

我需要列出使用某个部分的模型,例如:PART C 用于构建模型 X、Y 和 Z。

我不想手动列出所有列,因为它们很多而且经常更改。

你有什么建议?

4

2 回答 2

0

如果我理解正确,您需要多对多关系,因为与每个模型关联的零件数量是可变的。我不知道这个heidisql,但技术必须相同。

基本上,您所拥有的是一张用于零件的表格

部分:


编号 | 姓名


另一个用于模型


编号 | 姓名


最后是连接前两个表的第三个表

models_to_parts


编号 | 型号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

于 2013-03-11T09:54:20.483 回答
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'

如果模型列未知/众多,您可以从信息模式创建上述 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,具体取决于列名的聚合长度。

于 2013-03-11T09:56:30.557 回答