Font
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]3730[/thread]

mysql-query länge



<< |< 1 2 >| >> 18 entries, 2 pages
Froschpopo
 2006-10-17 00:21
#34812 #34812
User since
2003-08-15
2653 articles
BenutzerIn
[default_avatar]
Ich hab ne Liste mit ca. 600 Benutzern. Diese Liste stammt aus einer PIPE, das ist also der Grund warum die Liste nicht ebenfalls eine Datenbank ist.

Nun möchte ich diejenigen Datensätze anzeigen, die diesen Benutzern zuzuordnen sind.

Dazu brauche ich einen Query wie folgt:
Code: (dl )
1
2
3
4
5
6
SELCT fields FROM tbl WHERE
name = '$name1' or
name = '$name2' or
name = '$name3' or
name = '$name4' or
usw.

letztendlich sind ca. 500-2000 solcher Bedingungen üblich. Es handelt sich dabei aber um einfache äquivalenztests. mathematische bedingungen sind in der WHERE-Klausel kaum enthalten.
Kann man das so machen oder gibts irgendwelche Befürchtungen?
renee
 2006-10-17 10:41
#34813 #34813
User since
2003-08-04
14371 articles
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
4
5
my @names = qw(name1 name2 ...);
my $select = 'SELECT fields from tble where name IN('.join(',',('?') x scalar(@names)).')';

my $sth = $dbh->prepare or die $dbh->errstr();
$sth->execute(@names);
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Froschpopo
 2006-10-17 15:22
#34814 #34814
User since
2003-08-15
2653 articles
BenutzerIn
[default_avatar]
Sauber :)
Eines versteh ich aber in der manual noch nicht:
Code: (dl )
IN ist sehr schnell ist, wenn die IN-Werteliste ausschließlich aus Konstanten besteht.

wie ist das gemeint und warum gibt es den Unterschied?\n\n

<!--EDIT|Froschpopo|1161084202-->
nepos
 2006-10-17 15:28
#34815 #34815
User since
2005-08-17
1420 articles
BenutzerIn
[Homepage] [default_avatar]
Hm, ich vermute mal, damit ist gemeint, dass IN(...) fix ist, wenn IN so aussieht:
Code: (dl )
SELECT ... FROM ... WHERE ... IN(1,2,3,4,5)

Es gibt ja auch die Moeglichkeit von verschachtelten SELECTs:
Code: (dl )
SELECT ... FROM ... WHERE ... IN(SELECT ... FROM ...)

Da wuerde der innere SELECT erstmal die Liste fuer das IN aufbauen muessen, was natuerlich laenger dauert, als wenn du die Werte fuer IN schon fertig parat hast.

Ist jetzt aber nur ne Vermutung. Dein Zitat ist ein wenig kurz ;)
Froschpopo
 2006-10-17 19:54
#34816 #34816
User since
2003-08-15
2653 articles
BenutzerIn
[default_avatar]
[quote=renee,17.10.2006, 08:41]
Code: (dl )
1
2
3
4
5
my @names = qw(name1 name2 ...);
my $select = 'SELECT fields from tble where name IN('.join(',',('?') x scalar(@names)).')';

my $sth = $dbh->prepare or die $dbh->errstr();
$sth->execute(@names);
[/quote]
das soll wohl $sth->execute($select); heißen
Froschpopo
 2006-10-17 20:02
#34817 #34817
User since
2003-08-15
2653 articles
BenutzerIn
[default_avatar]
hm also irgendwie sieht das join so aus:
Code: (dl )
1
2
3
4
5
6
WHERE name IN(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?




,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)


ich hab versucht das ? durch $_ zu ersetzen aber irgendwie klappt das auch nicht. Ich brauch ja anstelle des ? die einzelnen Elemente aus dem Array. Das problem ist ja, dass ich um das arrayelement noch die ' ' machen muss damit mysql das annimmt\n\n

<!--EDIT|Froschpopo|1161101950-->
pq
 2006-10-17 20:52
#34818 #34818
User since
2003-08-04
12207 articles
Admin1
[Homepage]
user image
[quote=Froschpopo,17.10.2006, 17:54][quote=renee,17.10.2006, 08:41]
Code: (dl )
$sth->execute(@names);
[/quote]
das soll wohl $sth->execute($select); heißen[/quote]
nein, soll es nicht. wie kommst du auf die idee, dass die methode
execute() als argument das sql bekommt, aus dem $sth ja schon
erzeugt wurde?
execute() bekommt als argument die werte, für die im sql platzhalter
stehen (die fragezeichen).
ich dachte, du programmierst schon lang genug mit DBI und bist auch
lang genug im forum, um das zu wissen. und auch, um zu wissen,
dass selber quoten unsicher ist.\n\n

<!--EDIT|pq|1161104120-->
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
pq
 2006-10-17 20:53
#34819 #34819
User since
2003-08-04
12207 articles
Admin1
[Homepage]
user image
[quote=renee,17.10.2006, 08:41]
Code: (dl )
1
2
3
4
5
my @names = qw(name1 name2 ...);
my $select = 'SELECT fields from tble where name IN('.join(',',('?') x scalar(@names)).')';

my $sth = $dbh->prepare or die $dbh->errstr();
$sth->execute(@names);
[/quote]
das muss
my $sth = $dbh->prepare($select) or die $dbh->errstr();
heißen.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Froschpopo
 2006-10-17 22:44
#34820 #34820
User since
2003-08-15
2653 articles
BenutzerIn
[default_avatar]
Code: (dl )
1
2
my $sth = $dbh->prepare($select);
$sth->execute() or die $DBI::errstr;

so hab ichs gemacht und so funktioniert es! OHNE den Array im execute()!!\n\n

<!--EDIT|Froschpopo|1161110741-->
esskar
 2006-10-17 22:49
#34821 #34821
User since
2003-08-04
7321 articles
ModeratorIn

user image
[quote=Froschpopo,17.10.2006, 20:44]
Code: (dl )
1
2
3
4
5
my @names = qw(name1 name2 ...);
my $select = 'SELECT fields from tble where name IN('.join(',',('?') x scalar(@names)).')';

my $sth = $dbh->prepare($select);
$sth->execute(@names) or die $DBI::errstr;

so hab ichs gemacht und so funktioniert es! OHNE den Array im execute()!![/quote]
das ist aber nicht gut
richt wäre es
Code: (dl )
1
2
my $sth = $dbh->prepare($select);
$sth->execute() or die $DBI::errstr;
<< |< 1 2 >| >> 18 entries, 2 pages



View all threads created 2006-10-17 00:21.