in reply to Re^2: sql join with multiple select
in thread sql join with multiple select
You can avoid typing errors by copy/pasting from your actual code.
If you want to SELECT more fields then add them into the SELECT part, not the WHERE part. This is explained in the SQL tutorial suggested by LanX. Change this
SELECT SND.userid, SND.firstname, SND.lastname FROM msg as M JOIN users as SND ON SND.userid = M.msg_from WHERE M.msg_to = ? AND M.received iS NULL IN (SELECT title, age, country FROM MSG)
to this
SELECT userid, FNAME, LNAME, title, age, country FROM msg as M JOIN users as SND ON SND.userid = M.msg_from WHERE M.msg_to = ? AND M.received iS NULL
But, if title, age and country relate to the user why add them to message table MSG and not the user table ?. Also, age increases over time whereas birth date/year is constant. If required, age can be calculated.
As your requirements are increasing this seems a good time to change your data structure from an ArrayOFArrays(AoA) to an ArrayOfHashes(AoH) by adding {} here my $data = $sth->fetchall_arrayref({}); and changing your template to
<body> [% FOREACH name IN list %] <p>userid [% name.userid %] </p> <p>firstname [% name.FNAME %] </p> <p>lastname [% name.LNAME %] </p> <p>title [% name.title %] </p> <p>age [% name.age %] </p> <p>country [% name.country %] </p> [% END %] </body>
The advantage is a clearer template and the order of fields in the SELECT does not matter.
#!/usr/bin/perl use strict; use DBI; use Template; my $template = Template->new; my $DBH = get_dbh(); # connect somehow my $janedeo_id = 2; my $sth = $DBH->prepare('SELECT userid, FNAME, LNAME, title, age, country FROM msg as M JOIN users as SND ON SND.userid = M.msg_from WHERE M.msg_to = ? AND M.received iS NULL'); $sth->execute($janedeo_id); my $data = $sth->fetchall_arrayref({}); my $templ =<< "END_HTML"; <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1 +/> <title>Untitled Document</title> </head> <body> [% FOREACH name IN list %] <p>userid [% name.userid %] </p> <p>firstname [% name.FNAME %] </p> <p>lastname [% name.LNAME %] </p> <p>title [% name.title %] </p> <p>age [% name.age %] </p> <p>country [% name.country %] </p> [% END %] </body> </html> END_HTML $template->process (\$templ, { list => $data }) or die $template->error;
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^4: sql join with multiple select
by bigup401 (Pilgrim) on Oct 04, 2018 at 14:01 UTC | |
by poj (Abbot) on Oct 04, 2018 at 14:28 UTC | |
by bigup401 (Pilgrim) on Oct 04, 2018 at 15:06 UTC | |
by bigup401 (Pilgrim) on Oct 04, 2018 at 16:05 UTC | |
by poj (Abbot) on Oct 04, 2018 at 17:00 UTC | |
by bigup401 (Pilgrim) on Oct 04, 2018 at 17:08 UTC | |
| |
by marto (Cardinal) on Oct 04, 2018 at 14:32 UTC | |
by bigup401 (Pilgrim) on Oct 04, 2018 at 14:49 UTC | |
by poj (Abbot) on Oct 04, 2018 at 15:22 UTC | |
by bigup401 (Pilgrim) on Oct 04, 2018 at 15:27 UTC | |
|