给定行包含“1”的SQL列表列

时间:2013-03-11 09:37:59

标签: mysql sql heidisql

我的应用程序读取用户创建的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.

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

你有什么建议?

2 个答案:

答案 0 :(得分:0)

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

基本上,你拥有的是一个零件表

<强>部分:


id |名称


另一个模型


id |名称


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

<强> models_to_parts


id | model_id | PART_ID


这些表之间的关系是:

enter image description here

用于检索与模型关联的部件的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的值,具体取决于列名的总长度。