2014-05-10 73 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 
...