2014-05-10 74 views
0

这是我的场景。我有一个字段类型的事件表,其中值1 =食物,2 =食谱。简化,我的事件表有这样的结构:改进此查询以从不同表中获取数据

id | entity_id | user_id | type | timestamp | field1 | ... field n 

场“ENTITY_ID”是指一种独特的自动增加值从“实体”表。食物和食谱表结构非常相似,具有entity_id和user_id字段。

我想要的是从最后10个寄存器的表事件中获取所有常用数据,并根据表事件的类型值获取相应表的一些必需字段。现在我已经取得了一些颇为相似,但不正是我想要的,与此查询:

SELECT a.*, b.name, b.field1, b.field2, c.name, c.field1, c.field2 
FROM events a 
LEFT JOIN foods b ON b.entity_id = a.entity_id 
LEFT JOIN recipes c ON c.entity_id = a.entity_id 
ORDER BY timestamp DESC LIMIT 10 

此八方通将返回所有表中的所有领域,具有NULL值时,该字段为这个特定类型的不寄存器。 所以我想获取相应表的所有字段的事件表和名称,字段1,字段2。

编辑:

这里是sqlfiddle sqlfiddle.com/#!2/18d45/9我想查询基于表返回不同的字段值。在示例表中,食谱具有描述字段,而食物不具有描述字段。可能吗?

请帮助我这个!

+1

请张贴一些示例数据,以及所期望的结果。最好的办法是制作一个sqlfiddle,以便我们可以尝试对数据进行不同的查询。 – Barmar

+0

这里是sqlfiddle http://sqlfiddle.com/#!2/18d45/9 我想查询基于表返回不同的字段值。在示例表中,食谱具有描述字段,而食物不具有描述字段。可能吗? –

回答

1

您可以使用一个COALESCE拿到第一NOT NULL列:

SELECT a.*, 
    COALESCE(b.name, c.name), 
    COALESCE(b.field1, c.field1), 
    COALESCE(b.field2, c.field2) 
FROM events a 
...