views:

1485

answers:

2

Here's my query in Codeigniter:

$this->db->select('comments.created_at, comments.section_id, comments.submittedby_id, users.username, comments.text, sections.name');
$this->db->order_by('comments.created_at', 'desc');
$this->db->where('comments.submittedby_id',  'users.user_id'); 
$this->db->where('comments.section_id', 'sections.id'); 

$query = $this->db->get(array('comments', 'users', 'sections'),10);

This produces the following SQL request:

SELECT pdb_comments.created_at, pdb_comments.section_id, pdb_comments.submittedby_id, pdb_users.username, pdb_comments.text, pdb_sections.name FROM (pdb_comments, pdb_users, pdb_sections) WHERE pdb_comments.submittedby_id = 'users.user_id' AND pdb_comments.section_id = 'sections.id' ORDER BY pdb_comments.created_at desc LIMIT 10

Issue with this is that the DB prefix ('pdb_') does not get added in the WHERE clause. I can manually insert the prefix by appending "$this->db->dbprefix", but this doesn't fix the main problem -- quotes:

`pdb_comments`.`submittedby_id` = 'pdb_users.user_id'

The quotes on the right side are not accurate and generate 0 results for me. Is there any way to make Codeigniter recognize the second half of the where clause as a piece of my table? (thereby adding the DB prefix and properly placing the quotes)

Or is there another way to do this? (trying to avoid 2 joins here)

Thanks. Jon

+1  A: 

Possibly a dumb question, but why don't you just write the SQL directly? The interface doesn't look like it's giving you anything but clutter.

MarkusQ
nice to use the CI calls instead -- gives me flexibility with DB prefixes, etc.
jmccartie
+2  A: 

Use:

$this->db->select('comments.created_at, comments.section_id, comments.submittedby_id, users.username, comments.text, sections.name');
$this->db->from('comments');
$this->db->join('users', 'comments.submittedby_id=users.user_id'); 
$this->db->join('sections', 'comments.section_id=sections.id'); 
$this->db->order_by('comments.created_at', 'desc');
$query = $this->db->get();

instead.

Ch4m3l3on
i'm trying to avoid the joins to reduce overhead. not possible? or not needed?
jmccartie
What you were trying to accomplish is still a join; not an explicit join (is doesn't use the "join" keyword), but a join nevertheless. You should use explicit joins, to make your code more readable. Also, use EXPLAIN sql_statement, in your favourite client to see how the query is constructed.
Ch4m3l3on