2010-09-15 8 views
1

J'ai une base de données dans le format suivant:Comment écrire la requête mySQL suivante?

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

et idB idA ensemble sont uniques.

Je dispose d'un fichier (list.txt) avec une liste de paires id comme ceci:

xyz 2 
abc 5 
abc 6 
... 

et je voudrais l'imprimer avec stringValue dans chaque ligne. Notez que certaines paires d'identificateurs du fichier peuvent être absentes de la base de données. Dans ce cas, je ne veux pas les imprimer du tout.

En bref, je veux filtrer une table en utilisant un fichier.

Répondre

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

Souhaitez-vous donner toutes les colonnes où idA est égal à « xyz » et idB est égal à 12.

+0

mais puis-je utiliser un fichier à faire pour chaque ligne en elle? –

+0

Non. Vous devez écrire un script qui fait cela pour vous. – halfdan

0

Le nombre de clauses OR sera dynamique en fonction du nombre de combinaisons dans votre fichier.

Vous aurez probablement besoin de faire une requête dynamique créée sur les lignes de

SELECT * FROM myTable 
WHERE 
(idA = 'xyz'AND idB = '2') 
OR 
(idA = 'abc'AND idB = '5') 
OR 
(idA = 'abc'AND idB = '6') 
...... 
0

Certains clients SQL fournit-il l'installation qui vous permettent de créer des requêtes ou des données directement à partir de fichiers. Cependant, je crois que la meilleure approche serait d'écrire un script pour cela.

Sur la base d'autres questions que vous avez données récemment comme this one alors peut-être la solution ci-dessous en Perl peut vous aider:

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; 
} 

Si je fais maintenant ce qui suit en utilisant votre exemple list.txt ...

say $query; 
say join ":", @bind; 

alors je reçois:

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

Ce qui est exactement ce que je eed à ensuite se connecter directement à une requête DBI.

Espérons que ça aide.

/I3az/

Questions connexes