gpt4 book ai didi

SQLite:结合 OR 和 AND

转载 作者:行者123 更新时间:2023-11-29 01:47:20 27 4
gpt4 key购买 nike

这是来自 Selecting the highest salary 的继续问题

假设有一个表 'wagetable'

  name     lowhours  highhours  wage  priority 
Default 0.0 40.0 100 0
Default 40.0 50.0 150 0
Default 50.0 70.5 154 0
Default 70.5 100.0 200 0
Brian 0.0 40.0 200 1
Brian 40.0 50.0 250 1
Brian 50.0 60.0 275 1
Brian 60.0 70.0 300 1
Brian 70.0 80.0 325 1
Brian 80.0 9999.0 350 1
Chad 0.0 40.0 130 1
Chad 40.0 9999.0 170 1

我目前每秒执行 3-4 次两种类型的查询,因此性能是关键,而不是真正的可读性(但首选)。

当且仅当 $Hour 介于 lowhours 和 highhours 之间时,此查询才选择工资:

SELECT wage 
FROM wagetable
WHERE name LIKE '$Employee' OR name LIKE 'Default'
AND '$Hour' BETWEEN lowhours AND highhours
ORDER BY priority DESC
LIMIT 1

如果第一个查询未能在低点和高点之间找到 $Hour,则第二个查询将启动:

SELECT wage 
FROM wagetable
WHERE name LIKE '$Employee' OR name LIKE 'Default'
ORDER BY priority DESC, highhours DESC
LIMIT 1

我想看看是否可以有一个查询,我可以将两者结合起来在一个查询中做同样的事情

编辑:

因为我没有正确测试上面的查询..我会用英语告诉你我想要什么和答案的例子。

它会检查表中是否存在 $Employee,然后使用它。如果没有,则改为检查“默认”。一旦它知道名字,它就会检查 $Hour 是否在已知的低小时和高小时之间,如果是,选择那个工资,如果它高于列出的任何东西,自动取最高小时的工资。

这里有一些值。请注意,“sam”不在表格中,因此他将是“默认”示例遵循以下格式:(姓名,时间)预期答案

(Sam, 1)        100
(Sam, 51) 154
(Sam, 999999) 200

(Brian, 1) 200
(Brian, 51) 275
(Brian, 999999) 350

这里又是表格,因此您可以快速引用,记住 Sam 将是“默认”

name     lowhours  highhours  wage  priority 
Default 0.0 40.0 100 0
Default 40.0 50.0 150 0
Default 50.0 70.5 154 0
Default 70.5 100.0 200 0
Brian 0.0 40.0 200 1
Brian 40.0 50.0 250 1
Brian 50.0 60.0 275 1
Brian 60.0 70.0 300 1
Brian 70.0 80.0 325 1
Brian 80.0 9999.0 350 1

编辑 2:

这样做的目的是让您可以定义一个工资表,如果某人的收入比其他人多,他们将获得一定数额的工资加上加类费。如果是标准 worker ,则获得Default工资。如果 $Employee 在列表中,那么他将获得特殊工资。

最低的 lowhours 将 -always- 为 0.0,lowhourshighhours 对将 -never- 有任何差距(它不会'不允许 40-50,然后跳过并做 60-70)。不确定的是最高 highhours。所以是$Hour高于$Employee的最高highhours,那么应该使用$Employee最高highhours的工资。

例如;如果“Betty Sue”工作了 200 小时,它将获得 Default 的最高 highhours 工资...即 200。因此,“Betty Sue”在她工作第 200 天时的工资hour 是每小时 200。

现在,如果 Brian 工作 10000 小时,他将不会赚取 Default 的最高 highhours 工资...但是他将赚取 Brian 的最高 highhours 工资是 350。

基准测试结果:

这是基于 2000 次查询(匹配 1000 次,默认不匹配 1000 次):

Timwi 的方法:4348 毫秒

OMG Ponie 的方法:5843 毫秒

我的方法最多使用 5 个查询且至少使用 2 个:5844 毫秒

最佳答案

我相信这是做你想做的最直接的方法:

SELECT IFNULL(
(SELECT wage FROM WAGETABLE WHERE name LIKE '$Employee'
AND '$Hour' BETWEEN lowhours AND highhours),
(SELECT wage FROM WAGETABLE WHERE name LIKE 'Default'
ORDER BY highhours DESC LIMIT 1)
)

它做你在另一个问题中描述的:

  • 获取$Employee的工资;
  • 如果 $Employee 没有行,则结果为 NULL,因此 ISNULL 开始;
  • 只有当第一个结果为 NULL 时,才会检索默认行。

但是,我觉得我应该指出您在这个问题中发布的查询有些不同。我的查询未找到具有匹配的 lowhours/highhours 间隔的 Default 行,它只会返回具有最高 的行highhours 默认值。我不知道问题中的查询是否真的是您想要的,但似乎更有可能,因此这里有一个查询等同于您在这个问题中实际提出的问题:

SELECT IFNULL(
(SELECT wage FROM WAGETABLE WHERE (name LIKE '$Employee' OR name='Default')
AND '$Hour' BETWEEN lowhours AND highhours
ORDER BY priority DESC LIMIT 1),
(SELECT wage FROM WAGETABLE WHERE name LIKE '$Employee' OR name='Default'
ORDER BY priority DESC, highhours DESC LIMIT 1)
)

关于SQLite:结合 OR 和 AND,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3539890/

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