我已经开始头晕目眩了,我需要你的帮助。
我的数据库
- 导入的 CSV 文件:22 列和 11k 行
- 2 个表 具有相同的数据(均从 CSV 创建)
- 将 ID 作为 PRIMARY KEY 添加到两者
- 所有 VARCHAR(60) 部分列为空字符串 ' '
数据库:
PID | CODE 1 | CODE 2 | CODE 3 | CODE 4 | CODE 5 | CODE X (up to 9) | ID
-------------------------------------------------------------------------
1 | a | b | c | | | | 1
2 | a | | b | d | | | 2
3 | x | | | | | y | 3
- 数据库有 22 列,但我只包括 CODE 列(最多 9) 我可能对其中的 SQL 语句感兴趣。
- 它只会读表 - MyISAM 引擎吗?
我想做什么
select PID = 1 from first table
and retrieve all PIDs from second table
IF
selected PID's column CODE 1
or
selected PID's column CODE 2 (which is b) etc (up to 9).
= any PID's CODE X
所以我应该只得到 PID 2。
编辑: PID 不是 ID,它只是一个示例代码,它可以是字符串:'002451' 我正在寻找具有相同代码的其他 PID(例如 PID1
有 code = a
所以它应该找到 PID2
因为其中一个 CODE
列包含 a
)
我的尝试
SELECT a.* FROM `TABLE1` a WHERE
(
SELECT * FROM `TABLE2` b WHERE b.`PID` = 1
AND
(
( b.`CODE 1` NOT IN ('') AND IN (a.`CODE 1`,a.`CODE 2`, A.`CODE 3`...) ) OR
( b.`CODE 2` NOT IN ('') AND (a.`CODE 1`,a.`CODE 2`, A.`CODE 3`...) ) OR...
我最终会遇到大型查询 - 超过 81 个条件。在性能方面……好吧,它不起作用。
我凭直觉知道我应该:
- 使用索引(在 CODE 1/CODE 2/CODE 3 等上?)
- 使用 JOIN ON(但我太笨了)- 这就是我创建 2 个表的原因(假设我不想要 TEMP.TABLES)
如何高效地编写SQL/设计DB?
最佳答案
正确的数据结构是每个pid
和code
一行。最简单的方法是:
create table PCodes (
pid int not null,
code varchar(255),
constraint fk_PCodes_pid references p(pid)
);
这样您就可以在单个列中获得值,并且检查匹配代码会简单得多。
在实践中,你应该有三个表:
create table Codes (
CodeId int not null auto_increment primary key,
Code varchar(255)
);
create table PCodes (
pid int not null,
codeid int not null,
constraint fk_PCodes_pid references p(pid),
constraint fk_PCodes_codeid references codes(codeid);
);
如果代码的顺序对于每个“p”都很重要,则在 PCodes
表中包含一个 priority
或 ordering
列。
关于MySQL - 如何优化大量条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36261394/