如何更有效地与mySQL进行以下交互?

时间:2010-03-03 12:22:44

标签: mysql performance sql

我有一个包含唯一MySql ID组合的数组:

例如:

[
 [1,10,11],
 [2,10],
 [3,10,12],
 [3,12,13,20],
 [4,12]
]

总共有几百种不同的ID组合。

其中一些组合是“有效的”,有些则不是。例如,[1,10,11]可能是有效组合,而[3,10,12]可能无效。

组合有效或无效,具体取决于数据在数据库中的排列方式。

目前我正在使用SELECT语句来确定ID的特定组合是否有效。它看起来像这样:

SELECT id1 
FROM table
WHERE id2 IN ($combination)
GROUP BY id1
HAVING COUNT(distinct id2) = $number

...其中$ combination是ID的一种可能组合(例如1,10,11),$ number是该组合中ID的数量(在本例中为3)。无效组合将返回0行。有效组合将返回1行或更多行。

但是,要解决整个可能的组合集意味着循环几百个SELECT语句,我宁愿不这样做。

我想知道:是否有任何技巧可以提高效率?是否有可能一次性将整个数据集提交给mySQL,并让mySQL迭代它?任何建议都会非常感激。

提前致谢!

1 个答案:

答案 0 :(得分:0)

如果我正确地关注你的冒号,那么......

使用您之前描述的数据:

CREATE TABLE valid_combinations (
   combination_id INT NOT NULL,
   record_id INT NOT NULL
   PRIMARY KEY (record_id, combination_id),
   KEY (record_id)
)

则...

INSERT INTO valid_combinations (combination_id, record_id)
VALUES (1, 1);
INSERT INTO valid_combinations (combination_id, record_id)
VALUES (1, 10);
INSERT INTO valid_combinations (combination_id, record_id)
VALUES (1, 11);

INSERT INTO valid_combinations (combination_id, record_id)
VALUES (2, 2);
INSERT INTO valid_combinations (combination_id, record_id)
VALUES (2,10);

...     价值观(5,12);

然后...

SELECT 1
FROM valid_combinations a
WHERE a.record_id IN ($combination)
AND NOT EXISTS (SELECT 1 FROM valid_combinations b
   WHERE b.record_id NOT IN ($combination)
   AND b.combination_id=a.combination_id);

但是我真的不明白为什么你需要解决所有可能的组合。

我的解决方案可能会更快,但算法的顺序并不比你的好 - 只是将循环移动到数据库。

下进行。