如何编写以下mySQL查询?

时间:2010-09-15 09:14:52

标签: mysql

我有以下格式的数据库:

idA | idB | stringValue
----+-----+------------
xyz |  1  | ANDFGFRDFG
xyz |  2  | DTGDFHFGH
xyz |  3  | DFDFDS
abc |  5  | DGDFHHGH
abc |  6  | GG
...

idA和idB 在一起是唯一的。

我有一个文件(list.txt),其中包含ID对列表,如下所示:

xyz 2
abc 5
abc 6
...

我想在每一行打印stringValue。请注意,DB中可能缺少文件中的一些ID。在这种情况下,我根本不想打印它们。

简而言之,我想使用文件过滤表格。

3 个答案:

答案 0 :(得分:0)

SELECT idA, idB, stringValue FROM table WHERE idA = 'xyz' AND idB = 12;

将为您提供idA等于“xyz”且idB等于12的所有列。

答案 1 :(得分:0)

根据文件中的组合数量,OR子句的数量将是动态的。

您可能需要在

行上创建一个动态创建的查询
SELECT * FROM myTable
WHERE 
(idA = 'xyz'AND idB = '2')
OR 
(idA = 'abc'AND idB = '5')
OR
(idA = 'abc'AND idB = '6')
......

答案 2 :(得分:0)

某些SQL客户端确实提供了允许您直接从文件创建查询或数据的工具。但是我认为更好的方法是为此编写脚本。

根据您最近提出的其他问题,例如this one,或许Perl中的以下解决方案可能对您有所帮助:

use 5.012;
use warnings;
use SQL::Abstract;

my $sql   = SQL::Abstract->new;
my @cols  = qw/ idA idB stringValue /;
my $where = build_sql_where_from_file( 'list.txt', @cols[0,1] );

my ($query, @bind) = $sql->select( 
    'yourTable',
    \@cols,
    $where,
);

sub build_sql_where_from_file {
    my $file = shift;
    my @build;

    open my $fh, '<', $file or die $!;

    for my $line (<$fh>) {
        chomp $line;
        my @fields = split / /, $line;

        push @build, {
            -and => [ 
                map { $_ => shift @fields } @_,
            ]
        };
    }

    return \@build;
}

如果我现在使用您的示例list.txt ...

执行以下操作
say $query;
say join ":", @bind;

然后我得到:

SELECT idA, idB, stringValue FROM yourTable WHERE ( ( ( idA = ? AND idB = ? ) OR ( idA = ? AND idB = ? ) OR ( idA = ? AND idB = ? ) ) )
xyz:2:abc:5:abc:6

这正是我需要直接插入DBI查询的内容。

希望有所帮助。

/ I3az /