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

SQL::Abstract und LEFT JOIN

Leser: 1


<< |< 1 2 >| >> 11 Einträge, 2 Seiten
Froschpopo
 2007-11-22 16:20
#102795 #102795
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
huhu
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/usr/bin/perl

use strict;
use warnings;
use SQL::Abstract;

my $sql = SQL::Abstract->new;

my @fields = ('id', 'name');
my %where = (id => 15);

my($sth, @bind) = $sql->select('users', \@fields, \%where);

print $sth,"\n";


Wie bekomme ich hier einen LEFT JOIN hinein?
Struppi
 2007-11-22 16:40
#102797 #102797
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Da ich eine eigenen Wrapper benutze weiß ich nicht wie Abstract funktioniert, aber bei mir würde das so gehen:
Code: (dl )
my($sth, @bind) = $sql->select('users LEFT JOIN x on(id)', \@fields, \%where);


Ich hab mir gerade mal den Quellcode angeschaut, es scheint eher so aussehen zu müssen:
Code: (dl )
my($sth, @bind) = $sql->select([qw(users x)], \@fields, \%where);
aber es funktioniert nur ein einfacher join.
Froschpopo
 2007-11-22 16:47
#102798 #102798
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
was du da machst ist ein INNER JOIN!
Ich vermute mal, dass ein LEFT JOIN bei SQL::Abstract irgendwas mit dem WHERE-Index zu tun hat.
Struppi
 2007-11-22 17:01
#102799 #102799
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Wo mach ich einen inner Join?
Siechfred
 2007-11-22 17:28
#102803 #102803
User since
2007-11-12
30 Artikel
BenutzerIn
[default_avatar]
Das, was Struppi macht, sieht mir in der Tat eher nach einem LEFT JOIN aus, die WHERE-Klausel braucht man ja eigentlich nur für die implizite Schreibweise des INNER JOINs. Soweit ich weiß, unterstützt SQL::Abstract momentan(?) ausschließlich INNER JOINS, aber keine LEFT/RIGHT JOINs.

Siechfred
Froschpopo
 2007-11-22 17:33
#102804 #102804
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
1
2
3
my($sth, @bind) = $sql->select(['users', 'sessions'], \@fields, \%where);

#SELECT users.id, sessions.name FROM users, sessions WHERE ( id = ? )


Wenn SQL::Abstract keine LEFT JOINS unterstützt hat sich das Modul für mich soweit erledigt, weil genau deshalb brauche ich es ja: Um Ordnung in meine komplexe Join,- und Subselect-Architektur zu bekommen.
Struppi
 2007-11-22 17:37
#102806 #102806
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Ja, das ist das was ich sagen wollte. Ich mach keinen inner join, das Beispiel für mein Modul macht einen left join.

Aber SQL::Abstract kann wohl nichts anderes als inner joins, das sieht man ja auch am Quelltext:

http://search.cpan.org/src/NWIGER/SQL-Abstract-1.2...

Hier wird die Angabe der Tabellen geparst:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
# Utility functions
sub _table  {
    my $self = shift;
    my $tab  = shift;
    if (ref $tab eq 'ARRAY') {
        return join ', ', map { $self->_quote($_) } @$tab;
    } else {
        return $self->_quote($tab);
    }
}
Froschpopo
 2007-11-22 17:48
#102808 #102808
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Ok, dann ab in die Tonne mit dem Teil weil ohne LEFT/RIGHT-Joins ist so ein Teil für mich nicht von Nutzen.
Wenn ich dein Wrapper richtig verstanden habe, dann nimmt er einem lediglich die WHERE-Klausel und den SELECT-Teil ab. Den inneren Teil des Statements, also quasi den Teil zwischen FROM und WHERE muss man dann schon selbst erfassen.
Froschpopo
 2007-11-22 19:49
#102828 #102828
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Hab jetzt übrigens einen "Hack" entwickelt, wenn man das so nennen kann.

Code: (dl )
$sql->select($table." LEFT JOIN sessions ON ...", \@fields, \%where);

was ist davon zu halten?
Ich mache mir quasi die Situation zu Nutze, dass SQL::Abstract keine Syntaxkontrolle durchführt.
Blöd ist nur, dass dieser die ON-Klausel des LEFT JOIN's nicht bequem mit Argumenten gefüttert werden kann wie das bei %where der Fall ist. Außerdem muss ich die Übergabewerte natürlich gesondert quoten.

Also doch nicht so toll, dieses SQL::Abtract.
Gibts dazu vielleicht noch eine etablierte Alternative?
Siechfred
 2007-11-22 20:48
#102832 #102832
User since
2007-11-12
30 Artikel
BenutzerIn
[default_avatar]
Da gibt's einen Workaround:

Write no more SQL, abstract it!

Vielleicht hilft Dir das.

Siechfred
<< |< 1 2 >| >> 11 Einträge, 2 Seiten



View all threads created 2007-11-22 16:20.