2013-05-02 66 views
0

我在MySQL的兩個表兩張表選擇從哪兒第二表中的行應顯示爲列第一

id | name   | date 
1 | Test Entry | 12/12/2013 
2 | Test Entry 2 | 12/12/2013 

id | entry_id | name | value 
1 | 1  | note1 | value1 
2 | 1  | note2 | value2 
3 | 2  | note1 | value1 
4 | 3  | note4 | value4 

其中entry_idnoteid的外鍵在entry

是否有任何解決方案,我可以創建一個SELECT,會給我一個像下面的結果?

entry_id | name   | note1 | note2 | note3 
1  | Test Entry | value1 | value2 | - 
2  | Test Entry 2 | value 1 | - | value3 

我想避免LEFT JOIN這裏(當前實現這樣工作),並希望加入note只有一次,如果這是可能的。 LEFT JOIN在這裏不好,因爲我不知道一個條目可以附加多少筆記。我目前的實現以這種方式工作,我首先通過note中的名稱獲取所有不同的筆記,然後通過PHP爲foreach構建SELECT。最後,SELECT語句如下所示:

SELECT 
E.id as entry_id, 
E.name as name, 
N1.value as note1_value, 
N2.value as note2_value, 
N3.value as note3_value 
FROM entry E 
JOIN LEFT note N1 ON E.id = N1.entry_id AND N1.name = 'note1' 
JOIN LEFT note N2 ON E.id = N2.entry_id AND N2.name = 'note2' 
JOIN LEFT note N3 ON E.id = N3.entry_id AND N3.name = 'note3' 

事情變得棘手,當我在note 20-30次加入。

+0

這將是我們更容易幫助你,如果你設置了[ SQL小提琴](http://sqlfiddle.com/) – 2013-05-02 18:43:54

+0

立即處理該問題。 – user1478283 2013-05-02 18:47:14

+0

JS小提琴網址:http://sqlfiddle.com/#!2/0b7ae/1 – user1478283 2013-05-02 18:54:33

回答

1

不,沒有辦法做到這一點,沒有加入。

我會建議做2個查詢。

  1. SELECT * FROM進入其中id = id
  2. SELECT * FROM記下entry_id = id

,然後加入在應用程序代碼的結果。你是對的,左邊的連接會變得很糟糕。

0

最好的辦法是使用每行有一個音符值和一個音符類型(數字)的表格。

id |值| note_no

像這樣,你可以使用盡可能多的筆記,只要你喜歡。

您可以使用group_concat在一行上獲得註釋。

舉一個例子,在這裏看到:http://lietoservetruth.wordpress.com/2010/12/13/mysql-group_concat-vertival-concat-concat-records/

這比問DB快一倍,而且最好DB設計...

+0

事情是,我需要這些筆記名稱爲列,您可以打開和關閉那些你想要或不想看到的。 – user1478283 2013-05-02 18:55:42

+0

當使用'group_concat'時,你可以把所選擇的字段放在一行... – rantanplan 2013-05-02 19:00:22

+0

是的,我知道關於group_concat,但我想是否有辦法讓他們在單獨的列。 group_concat會將所有列值作爲一個字符串返回給我。 – user1478283 2013-05-02 19:05:14

相關問題