【问题标题】:Find two values in two columns在两列中查找两个值
【发布时间】:2021-05-10 12:33:54
【问题描述】:

我正在我的网站上使用准备好的语句来实现 OOP PHP。

我有以下表名,“table”:

rowID id1 id2 name1 name2
1 55 56 name55 name56
2 55 60 name55 name60
3 54 55 name54 name55

我有两个用户定义的 ID 需要与 id1 或 id2 列匹配。

注意 id1 id2,将找不到匹配项。那是我的问题。我无法检查是否找到了 id1 和 id2 的组合,无论是 id1 > id2 还是 id1

如何使用占位符来做到这一点?

PHP 代码:

public function getMatch($id, $id2)
    {
        $sql = "SELECT * FROM table WHERE id1 = ? AND id2 = ?";
        $stmt = $this->connect()->prepare($sql);
        $stmt->execute([$id, $id2]);
        $outputs = $stmt->fetchAll();
        
         foreach ($outputs as $output) {
            echo $output["name1"];
            echo $output["name2"];
        }  
        
    }

处理用户定义的 ID:

    $Match = new getMatch();
    $Match->getMatch($input1, $input2);

如果 input1=id1=56 和 input2=id2=55,将找不到匹配项,即使 id1=55 和 id2=56 存在。

现在我只是在避免这个“解决方案”的问题:

    $Match->getMatch($input1, $input2);
    $Match->getMatch($input2, $input1);

其中一个将始终有效,而另一个返回 null。但我需要做得更优雅。

【问题讨论】:

  • 您可以更新查询以包含第二次调用 getMatch 的逻辑。因此WHERE case1 OR case2;
  • 嗨,雷米,感谢您的建议。我已经这样做了,并且它有效,但我也对该解决方案不满意:$a = $id1; $b = $id2;如果($a > $b) { $a = $id2; $b = $id1; }

标签: php mysql sql pdo


【解决方案1】:

您可以像这样使用运算符IN

SELECT *
FROM tablename
WHERE (?, ?) IN ((id1, id2), (id2, id1))

【讨论】:

  • 请注意,(令人恼火的)MySQL 无法对此进行优化。
  • @Strawberry 这是什么意思?它有什么实际后果吗?
  • 这意味着手写会更优化
【解决方案2】:
SELECT *
FROM t
WHERE (?, ?) IN ((id1, id2), (id2, id1))

【讨论】:

  • 非常感谢。 forpas 已经提出了建议,并且是一个可行的解决方案。
猜你喜欢
  • 1970-01-01
  • 2019-03-21
  • 2021-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-25
  • 1970-01-01
相关资源
最近更新 更多