【发布时间】:2016-03-28 11:27:39
【问题描述】:
我已经为此头晕目眩,我需要你的帮助。
我的数据库
- 导入的 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
- DB 有 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',我正在寻找具有相同 CODES 的其他 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有一行。拥有多个具有相同数据的列几乎不是正确的解决方案。 -
您能详细说明一下吗?每个pid 一行,每个代码一行?或者将这 22 列减少到只需要的列。