怎么做这个mysql查询我想要并排查询列?

时间:2013-07-23 23:01:25

标签: python mysql

我的表格结构如下:

col1 col2 col3
 1    1    1
 1    2    1
 1    3    1
 2    10   1

现在我在第1列的python (1,2)和第3列的(1,1)的元组中有这样的信息。

我想查询表,以便在select子句中我想将第1列值与第3列对应。

我的意思是

将有两个查询:

Select * from table where col1 = 1 and col3 = 1;
Select * from table where col1 = 2 and col3 = 1;

我希望将这些结合起来并为我的元组中的多个条目执行此操作。 我可以做很多ands和union,但这不是一个超过10个值的好解决方案。

1 个答案:

答案 0 :(得分:0)

最简单的方法,不太可能导致性能问题,将在元组之间进行迭代,并为每个元素生成AND条件,括在括号中并通过OR条件连接,从而生成查询:

SELECT * 
FROM table 
WHERE (col1 = 1 AND col3 = 1) 
  OR  (col1 = 2 AND col3 = 1) 
  OR  (...)

你是对的,因为这可能不会特别好地扩展。您可能首先分析在WHERE子句中使用其值的元组,以便生成一个更紧凑的条件,对于每个唯一可接受的col1值,或者将所有可接受的col3值组合在一起,然后将它们与col1进行AND运算值。例如,考虑元组(1, 1)(1, 2)(2, 1)(2, 3)以及从中生成的以下查询:

SELECT * 
FROM table 
WHERE (col1 = 1 AND (col3 = 1 OR col3 = 2)) 
  OR  (col1 = 2 AND (col3 = 1 OR col3 = 3))

这比第一种方法的结果稍微麻烦,并且需要提前一点点努力,但它可能会执行得更快,因为AND短路意味着数据库引擎可以更快地确定是否给定的行将满足WHERE子句;而不需要为每一行单独检查每个(col1 = @m AND col2 = @n)条件,它可以简单地检查行的col1值是否匹配,如果不匹配则忽略其余条件。

(当然,MySQL的查询优化器应该已经为你做了这个,虽然它需要彻底的基准测试才能确定,鉴于优化的显而易见性,我非常强烈地怀疑你是免费获得这个。但是,查询的第二种形式仍然是人类可读的,这对你来说可能是重要的,也可能没有关系。)

无论如何,如果你需要在许多可接受值的元组中执行此操作,那么您将生成一个相对复杂的查询或一堆简单的查询;每种方法都有其优点和缺点,但考虑到您的要求和输入,我倾向于怀疑您是否会找到一种算法,该算法生成的查询更加紧凑,如果行为不当,仍然可以进行调试。

如果您担心性能问题,我建议您等到表明存在性能问题之后再等担心。如果您已经这样做,请检查您正在查询的表上的索引;如果您尚未在WHERE条件中使用的列中创建索引,那么现在是一个非常好的时间。