如何在我想要并排查询列的地方进行mysql查询?

2024-04-25 06:41:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我的表结构如下:

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

现在我在python (1,2)中为列1和(1,1)中为列3提供了这样的元组信息。你知道吗

我想查询这个表,以便在select子句中使列1的值与列3对应。你知道吗

我的意思是

将有两个查询:

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

我想把它们组合起来,这样就可以得到元组中的尽可能多的条目。 我可以做很多and和union,但这不是一个好的解决方案,超过10个值。你知道吗


Tags: andfrom信息table条目where结构select
1条回答
网友
1楼 · 发布于 2024-04-25 06:41:35

您最简单的方法,不太可能导致性能问题,是遍历元组并为每个元组生成一个and条件,用括号括起来,用OR条件连接,从而生成一个查询:

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

不过,你说得对,这可能不会很好地扩展。相反,您可以首先分析在WHERE子句中使用其值的元组,以便生成更紧凑的条件,对于每个唯一的可接受col1值,或将所有可接受的col3值放在一起,然后将它们与col1值相加。例如,考虑元组(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))

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

(当然,MySQL的查询优化器应该已经为您做了这项工作,虽然需要进行彻底的基准测试才能确定,但考虑到优化的明显性,我强烈怀疑您是免费获得这项服务的。不过,第二种形式的查询更易于理解,这可能对您来说很重要,也可能不重要。)

无论如何,如果您需要跨多个可接受值的元组执行此操作,那么您将生成一个相对复杂的查询,或者一组简单的查询;每种方法都有其优点和缺点,但是考虑到您的需求和输入,我倾向于怀疑您是否能找到一种算法来生成一个两者都是的查询明显更紧凑,并且在出现错误时仍具有足够的可读性以进行调试。你知道吗

如果您担心性能问题,我建议您在证明存在性能问题之前不要担心这个问题。如果已经这样做了,请检查正在查询的表上的索引;如果还没有在WHERE条件中使用的列之间创建索引,那么现在是这样做的最佳时机。你知道吗

相关问题 更多 >