gpt4 book ai didi

mysql - SQL 查询以确定满足任意查询的所有值

转载 作者:行者123 更新时间:2023-11-29 03:42:01 26 4
gpt4 key购买 nike

我正在尝试弄清楚如何有效地运行一组查询,这些查询将提供一个包含所有值的新表,这些值将返回任意查询的结果。

假设我的表有这样的架构:

  • 编号
  • 姓名
  • 年龄
  • 城市

列出所有返回任意查询结果的值的有效方法是什么(例如,SELECT * FROM main WHERE NOT city=X AND age BETWEEN Y AND Z)?

我天真的方法是使用脚本并递归遍历 {city, age, age} 的所有可能组合,然后查看哪些 SELECT 返回超过 0 个结果,但这似乎非常低效。我也尝试过在 {city, age, age} 上构建大型连接,并且基本上使用该表作为查询的参数列表,但很快就无法对许多列进行查询。

对于简单的联合相等查询(例如,SELECT * FROM main WHERE name=X AND age=Y),这要简单得多,因为我可以这样做:

SELECT name, age, count(*) AS count FROM main GROUP BY name, age HAVING count > 0

但是对于比这更复杂的事情,我很难想出一个通用的方法。

任何指向正确方向的指示都会很有帮助,谢谢。

编辑:

抱歉,我似乎没有很好地解释这一点。

想象一个用户给了我一个数据库和一个模板查询,然后说,“告诉我我可以在这个查询中使用的所有值,这些值将从这个数据库中产生结果。”例如,用户可能想知道将至少返回一行的所有年龄范围查询(例如,模板查询是 SELECT * FROM main WHERE age BETWEEN X AND Y)。

在那个特定的示例中,可以运行 SELECT 来查找数据库中的最小/最大年龄,并告诉用户在这些年龄之间进行查询。

现在假设查询模板更复杂,例如 SELECT * FROM main WHERE NOT city=W AND age BETWEEN X AND Y AND name LIKE Z。如何确定可用于此查询以返回结果的 W/X/Y/Z 值的范围?是否需要为每个 {city, age, age, name} 组合创建一个连接表并在每一行上运行 SELECT?我怎样才能有效地执行此操作,以便操作在大型数据库上是有时间限制的?

希望这能说明问题。

最佳答案

您可以尝试在插入到您的表中之后编写一个触发器,如果​​值不存在,它会将值插入到另一个表中。这样你就会有一个表,其中包含你的表的不同值。这张表看起来像

 columnNameFromYourTable  |  distinctValue
city NY
city LA
age 1
age 2
...

然后当您想知道表中是否存在用于查询的记录时 SELECT * FROM main WHERE NOT city=W AND age BETWEEN X AND Y AND name LIKE Z 您可以查询 distinctTable与

select 1 from dual where 1=1
and not exists (select 1 from distinctTable where columnNameFromYourTable = 'city' and distinctValue = 'W')
and exists (select 1 from distinctTable where columnNameFromYourTable = 'age' and distinctValue BETWEEN X AND Y)
and exists (select 1 from distinctTable where columnNameFromYourTable = 'name' and distinctValue LIKE '%Z%')

这样会很快。如果它返回 1,则表中有一个条目,如果 NULL 则没有。

关于mysql - SQL 查询以确定满足任意查询的所有值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12618267/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com