in reply to Re: Avoiding SQL double jeopardy
in thread Avoiding SQL double jeopardy
Thanks! Adding a table does the trick at the cost of some reworking of adds and fetches. Is this the SQL equivalent of "Add another level of indirection"?
Reworked sample is:
use strict; use warnings; use DBI; my $dbh = DBI->connect('dbi:SQLite:dbname=xr.SQLite'); $dbh->do(<<SQL); CREATE TABLE Sessions ( SessId INTEGER PRIMARY KEY AUTOINCREMENT, DoneDate TEXT, Topic TEXT ) SQL $dbh->do(<<SQL); CREATE TABLE SessPeople ( SessId INTEGER, PersonId INTEGER, IsTeacher INTEGER ) SQL my $self = bless {dbh => $dbh}; $self->addSession(1, 2, 'Perl is fun', '2015-06-27') +; $self->addSession(3, 4, 'SQL is fun', '2015-06-27') +; $self->addSession(3, 5, 'SQL for fun and profit', '2015-06-20') +; $self->addSession(4, 1, 'PerlMonks is great', '2015-06-20') +; $self->addSession(2, 6, 'PerlMonks for fun and proffit', '2015-06-20') +; my $active = $self->getActiveSessions(1, 2); print "$_->[1], $_->[2]: '$_->[3]'\n" for @$active; sub addSession { my ($self, $teacher, $learner, $topic) = @_; $self->{dbh}->do(<<SQL, {}, $topic); INSERT INTO Sessions (Topic, DoneDate) VALUES (?, '') SQL my $sessId = $self->{dbh}->last_insert_id(undef, undef, undef, und +ef); $self->{dbh}->do(<<SQL, {}, $sessId, $teacher); INSERT INTO SessPeople (SessId, PersonId, IsTeacher) VALUES (?, ?, 1) SQL $self->{dbh}->do(<<SQL, {}, $sessId, $learner); INSERT INTO SessPeople (SessId, PersonId, IsTeacher) VALUES (?, ?, 0) SQL } sub getActiveSessions { my ($self, @ids) = @_; my $idPlaces = (join ', ', ('?') x @ids) || ''; return $self->{dbh}->selectall_arrayref(<<SQL, {}, @ids); SELECT DISTINCT s.SessId, t.PersonId, l.PersonId, s.Topic FROM Session +s s JOIN SessPeople t ON t.SessId == s.SessId AND t.IsTeacher JOIN SessPeople l ON l.SessId == s.SessId AND NOT l.IsTeacher JOIN SessPeople p ON p.SessId == s.SessId WHERE p.PersonId IN ($idPlaces) SQL }
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^3: Avoiding SQL double jeopardy
by Pope-O-Matik (Pilgrim) on Jun 28, 2015 at 03:55 UTC | |
by GrandFather (Saint) on Jun 28, 2015 at 05:08 UTC | |
by Pope-O-Matik (Pilgrim) on Jun 28, 2015 at 09:25 UTC | |
by GrandFather (Saint) on Jun 28, 2015 at 10:21 UTC | |
by Pope-O-Matik (Pilgrim) on Jun 28, 2015 at 12:11 UTC | |
| |
by Pope-O-Matik (Pilgrim) on Jun 28, 2015 at 19:59 UTC |