How you model your Things also has an impact here. If D1 and D2 are both children of a common parent ThingTemplate then using GetImplementingThings for that parent will return all of the D1 and D2 things. Likewise, if D2 was a child of D1, GetImplementingThings for D1 would include all D2 Things as well.
As Pai says you can use a custom service to bring together any combination of Things you desire.
Once you have your list of Things....... In your mashup you can then change the mashup display depending on the ThingTemplate for the selected Thing. You'd need a service that runs on The Selected Rows Changed Event that takes the SelectedRow ThingTemplate as input and returns the appropriate mashup name. You feed that result to a contained mashup widget that is the main part of your mashup. You'll need to use either mashup parameters or the session to pass the name of the selected Thing to the contained mashup so that it can determine which Thing it is displaying data for.
The best in-depth tutorial is either the on-line or classroom training that PTC-U provide. See PTC University - PTC Training - Class Schedule Search
Hope this helps