Dynamic query returns multiple data
What you get currently is what you asked for: leftJoin.

To get only the single object you're looking for, you must use join instead (which is default and equivalent to innerJoin).

BTW you may simplify your code using the short notation, like this:

$query = db_select('node', 'n')
  -&gt;fields('n', array('nid', 'title', 'type' ))
  -&gt;fields('b', array('body_value'))
  -&gt;fields('ttd',array('name'))
  -&gt;join('field_data_body', 'b', 'b.entity_id = n.nid')
  -&gt;join('taxonomy_index', 'ti', 'ti.nid = n.nid')
  -&gt;join('taxonomy_term_data', 'ttd', 'ttd.tid = ti.tid AND ttd.vid = "5"');