【问题标题】:Create condition that searches between two different WHEREs in the table创建在表中两个不同 WHERE 之间搜索的条件
【发布时间】:2022-01-26 04:53:12
【问题描述】:

我正在制作一个机器人互相战斗的小游戏。机器人在数据库中有一个表格,其中记录了他们的比赛分数。每个机器人都有自己的家乡岛,可以在那里面对对手。对手将拥有自己的岛屿。每个机器人都有自己的岛屿。这个问题很简单,但可能会导致混淆,所以我一步一步简单地解释一下:

解释

1.我从组合框中选择特定机器人的名称

if robot_her_island:
select_robot_on_her_island = select_war.split('-')[0]   

2. 使用Last_War_on_any_island 搜索所选机器人的最后一场战争。我寻找发生在你自己岛上或你对手岛上的战争。我只选择最后一战

#Last War on ANY island
cursor.execute("SELECT robot_on_her_island, robot_on_island_away, points_war_home, points_war_away FROM War WHERE robot_on_her_island =? OR robot_on_island_away=? LIMIT 1", [select_robot_on_her_island, select_robot_on_her_island])
Last_War_on_any_island = cursor.fetchall()[0]

3. 我创建了两个单独的 cursor.execute:一个用于机器人在自己的岛屿上战斗,另一个用于机器人在自己的岛屿上战斗。怎么会?因为问题在第 2 点看起来像这样解决了,但只有在 robot_on_her_island VS robot_on_island_away(数据库中的两个数据)之间发生战争并且对应的点是 points_war_home 和 points_war_away 时才可以。但是当战争倒退时,即robot_on_island_away VS robot_on_her_island,那么我也应该反转points_war_away-points_war_home,因为我正在尝试获取有关某个机器人的信息(在初始组合框中选择)。

因此,为了解决这个问题,我考虑创建两个单独的 cursor.execute,一个用于机器人在自己的岛屿上战斗时 (Last_War_on_her_island),另一个用于机器人在自己的岛屿上战斗时 (Last_War_on_her_island) Last_War_on_island_away)。这样我也可以交换points_war_home和points_war_away(相反,通过颠倒顺序)

我举第3点的例子:

MAZINGER VS GOLDRAKE robot_on_her_island VS robots_on_island_away = points_war_home, points_war_away (Mazinger, Goldrake = 2-1)

金雷克 VS MAZINGER robot_on_her_island VS robots_on_island_away = points_war_away, points_war_home (Goldrake-Mazinger = 3-2) #invert points

#Last War in robot home island
cursor.execute("SELECT points_war_home, points_war_away FROM War WHERE robot_on_her_island =? LIMIT 1", [select_robot_on_her_island])
Last_War_on_her_island = cursor.fetchall()[0]

#Last War in robot away island (robot island opponents)
cursor.execute("SELECT points_war_away, points_war_home FROM War WHERE robot_on_island_away =? LIMIT 1", [select_robot_on_her_island])
Last_War_on_island_away= cursor.fetchall()[0]

好!现在我有最后一场robot_on_her_island战争,和最后一场机器人对手robot_on_island_away战争。完美,但问题就在这里!

问题

我如何知道我最初从组合框中选择的最后一次机器人大战是在自己的岛上进行还是在其他机器人的岛上进行?

答案是我上面使用的 cursor.execute 叫Last_War_on_any_island,但我不知道如何将代码放在一起。让我解释一下:拥有Last_War_on_any_island 用于找出我用组合框选择的机器人的最后一场大战是什么,然后使用Last_War_on_any_island 我希望能够获得Last_War_on_her_islandLast_War_on_island_away

例如,我想得到这个:

例如,如果我在组合框中选择 Daitarn,则会搜索 Daitarn 的最后一场战争,即 id 2 (Jeeg-Daitarn) 中的那场战争。然后将打印 Last_War_on_island_away。如果我在组合框中选择了 Mazinger,则 Mazinger 的最后一场战争将在 id 1 (Mazinger-Goldrake) 中,因此将打印 Last_War_on_her_island。重要提示:当我说“最后一次”时,我指的是机器人名称最后一次显示在选项卡中(与 Home 或 Away 或 ID 无关),但只是名称最后一次出现

代码完成

    if robot_her_island:
    
    robot_her_island = select_war.split('-')[0]      
    
    #Last War on ANY island
    cursor.execute("SELECT robot_on_her_island, robot_on_island_away, points_war_home, points_war_away FROM War WHERE robot_on_her_island =? OR robot_on_island_away=? LIMIT 1", [select_robot_on_her_island, select_robot_on_her_island])
    Last_War_on_any_island = cursor.fetchall()[0]
    
    #Last War in robot home island
    cursor.execute("SELECT points_war_home, points_war_away FROM War WHERE robot_on_her_island =? LIMIT 1", [select_robot_on_her_island])
    Last_War_on_her_island = cursor.fetchall()[0]
    
    #Last War in robot away island (robot island opponents)
    cursor.execute("SELECT points_war_away, points_war_home FROM War WHERE robot_on_island_away =? LIMIT 1", [select_robot_on_her_island])
    Last_War_on_island_away= cursor.fetchall()[0]

    #THE PROBLEM IS HERE
    if Last_War_on_any_island is Last_War_on_her_island:
        print(Last_War_on_her_island)
    else
        print(Last_War_on_island_away)

【问题讨论】:

  • 你一直在说“最后一条记录”,但是 SQL 记录没有排序。除非您使用ORDER BY 子句,否则您将随机获得一条记录。
  • 你没有告诉我们你从哪里得到last_company_value,但如果那是一条记录,那么[4]正在选择第5个字段,你只有两个字段。
  • @TimRoberts 我不必对记录进行排序。目前记录的顺序已经正确。使用 ORDER BY 会破坏一切。由于 LIMIT,我使用了最后的记录。我已经做了一些测试,LIMIT 适合我的情况。 Last_company_value 感谢 cursor.execute。 Last_company_value 显示在问题的开头
  • @TimRoberts 你能帮帮我吗?
  • SQL 记录未排序。这是事实。它们有时似乎按创建顺序列出,但这是一个意外。如果数据库决定清理陈旧的数据,它们可能会以新的顺序出现。您必须使用ORDER BY 来获得您想要的订单。这是没有商量余地的。

标签: python sql python-3.x sqlite


【解决方案1】:

您可以在查询本身中测试它是在家还是外出。

cursor.execute("""
    SELECT
        CASE WHEN robot_on_her_island = ? THEN 'Last_War_on_her_island'
             ELSE 'Last_War_on_island_away'
        END AS which_island,
        points_war_home, points_war_away
    FROM war
    WHERE ? IN (robot_on_her_island, robot_on_island_away)
    LIMIT 1""",
    (select_robot_on_her_island, select_robot_on_her_island))
row = cursor.fetchone()
if row:
    which_island, points_home, points_away = row
    if which_island == 'Last_War_on_her_island':
        print(which_island, points_home, points_away)
    else:
        # Swap the points when won on the away island
        print(which_island, points_away, points_home)

顺便说一句,如果您只想要一行,请使用 fetchone() 而不是 fetchall()[0]

【讨论】:

  • Last_company_value [0] 和 [1] 分别对应什么?
  • 被抓取的行的前两列,分别是company1company2
  • 您的代码有问题。我总是得到“最后一家公司是 company2”。我做了几十次测试。当我 100% 确定我应该收到“最后一家公司是 company1”时,我也尝试过。也许它不起作用,因为 combo_company 始终存在于 Last_company_value [0] 和 [1] 中。我应该只使用使用 WHERE company1 = 的 company1 和 company2?或公司 2 =?限制 1. 你有其他解决方案吗?几天来我一直在尝试解决它,但我不能。谢谢
  • condition1 OR condition2 如果其中一个或两个条件为真,则为真。
  • 如果您只想要其中一家公司匹配但不能同时匹配的行,请使用 XOR
猜你喜欢
  • 1970-01-01
  • 2017-09-09
  • 2018-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-27
相关资源
最近更新 更多