【问题标题】:Finding part of composite primary key using Perl使用 Perl 查找复合主键的一部分
【发布时间】:2012-06-03 07:22:33
【问题描述】:

我正在尝试通过 Perl 查询 MySQL 数据库。我的数据库有一个表,其主键是 三列 PK1、PK2 和 PK3 的组合。我有数组 arr1 和 arr2 包含一些值 分别为 PK1 和 PK2。我想为每个在数据库中找到对应的 PK3 值 arr1 和 arr2 的可能组合(可能有一些组合没有价值 PK3)。例如:

PK1 PK2 PK3
"JIM"   "RED"   1
"JOHN"  "BLUE"  2
"ANN"   "GREEN" 3
"ANN"   "WHITE" 4
"ME"    "BLACK" 5
"ME"    "RED"   6

arr1 = ("JIM", "ME", "ANN")
arr2 = ("BLACK", "RED")

我应该得到结果:

arr3 = (1, 5, 6)

我能想到的最佳解决方案是:

foreach my $el1 (@arr1) {
    $i = 0;
    $query = "SELECT PK3 FROM table WHERE PK1 = $el1 AND PK2 = ?;";
    foreach my $el2 (@arr2) {
        my $query_handle = $connxn->prepare($query);
        $query_handle->execute($el2);
        $query_handle->bind_columns(undef, \$rec);
        while($query_handle->fetch()) {
            push(@arr3, $rec); 
        }
    }
}

但这行不通,因为会有 $el1 和 $el2 的组合 没有什么可绑定的。有没有更好/更快的方法来做到这一点?它是一张大桌子,数组是 也很长,所以我的程序即使没有给我错误也需要时间。我在这里没有想法, 所以任何帮助将不胜感激。谢谢!

【问题讨论】:

    标签: mysql perl


    【解决方案1】:

    你想要的查询是:

    SELECT PK3 FROM my_table WHERE PK1 IN ('JIM','ME','ANN') AND PK2 IN ('BLACK','RED')
    

    sqlfiddle 上查看。

    构建它:

    my $query = sprintf(
      "SELECT PK3 FROM my_table WHERE PK1 IN (%s) AND PK2 IN (%s)",
      join(",", ('?')x@arr1),
      join(",", ('?')x@arr2)
    );
    my $query_handle = $connxn->prepare($query);
    $query_handle->execute((@arr1, @arr2));
    

    【讨论】:

    • 谢谢...但是我将如何用@arr1@arr2 来写这个?
    • @user828647:我的 Perl 有点生疏了,但我认为上面的修改后的答案应该可以做到。
    • 谢谢!有用!但是您能否向我解释一下您在join 中使用的这个语法? ('?')x@arr1 是什么意思?
    • @user828647: x 是重复操作符。 ('?') 将运算符放入列表上下文中,因此它创建一个问号列表,其元素数量与@arr1 相同,resp。 @arr2。然后这些列表用逗号连接,创建所需的字符串?, ?, ?, ?
    猜你喜欢
    • 1970-01-01
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多