簡體   English   中英

從兩個表中選擇,第二個表中的行應在第一個表中顯示為列

[英]Select from two tables where rows from second table should be shown as columns in first

我在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_idnote是一個外鍵identry

我可以使用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'

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

不,沒有聯接就沒有辦法。

我建議做2個查詢。

  1. 從id = id條目中選擇*
  2. 從注釋中選擇*,其中entry_id = id

然后將結果加入您的應用程序代碼中。 您是對的,左聯接將很糟糕。

最好的方法是使用每行一個注釋值和一個注釋類型(數字)的表。

id | 價值| note_no

這樣,您可以使用任意數量的注釋。

您可以使用group_concat在一行上獲取注釋。

有關示例,請參見此處: http : //lietoservetruth.wordpress.com/2010/12/13/mysql-group_concat-vertival-concat-concat-records/

這比兩次詢問數據庫更快,並且是更好的數據庫設計...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM