2016-02-25 92 views
2

我有兩個表:如何編寫SQL查詢,其中一個列返回多個結果C#

用戶:

ID Name 
---------------- 
1  Bob 
2  Dave 
3  Mike 

書籍:

ID UserId BookName 
------------------------ 
1 1  Cat in Hat 
2 1  Happy Birthday 
3 1  One Fish 
4 2  Goldilocks 
5 2  Three Crows 
6 3  Hitchhikers 

用戶ID是一個關鍵的顯示哪些書各用戶擁有

在我的html我想創建看起來像這樣的輸出:

Name  Books Owned 
------------------------- 
Bob  Cat in Hat, Happy Birthday, One Fish 
Dave  Goldilocks, Three Crows 
Mike  Hitchhikers 

目前,我有一個循環,並嵌套查詢這樣做:

var queryusers = db.Query("SELECT * FROM users"); 

foreach (var user in queryusers) { 
    <span>@user.name</span> 
    var querybooks = db.Query("SELECT * FROM books WHERE userid = @0", user.id); 
    foreach (book in querybooks) { 
     <span>@book.bookname</span> 
    } 
} 

我知道這不是很好,但我不知道如何做到這一點與JOIN。如果我嘗試:

var queryusersandbooks = db.Query("SELECT * FROM users INNER JOIN books ON users.id = books.userid"); 

我的查詢返回6行,但我只想3.有沒有辦法做到這一點,而無需在迴路中的SQL查詢?

感謝

+0

你可以重新格式化你的表/字段描述嗎?我甚至無法理解它應該看起來像什麼.. – Seano666

+0

我也在你的最後一行似乎你想用戶的書沒有說誰是用戶..是sql .. – scaisEdge

+0

你可以使用查詢使用JOIN然後按用戶標識對項目進行分組並遍歷組。 –

回答

0

嘗試是這樣的

SELECT u.name,CONCAT_WS(',',b.bookname) AS user_books FROM users u INNER JOIN books b ON u.id = b.userid GROUP BY u.id 
0

如果我打算做這樣的事情在mysql中,我組用戶,並使用GROUP_CONCAT的結果結合起來:

select users.id, users.name, group_concat(bookname) as books 
from users inner join books on books.userid = user.id 
group by users.id, users.name 

如果您喜歡,您可以訂購併指定分隔符,請閱讀group_concat瞭解更多詳情。如果可能有很多書籍,或者如果您希望每本書成爲自己的專欄或類似的東西,但這種情況很快就會崩潰,但在簡單情況下就沒有問題。

0

您正處於正確的軌道上。在你的原始代碼中,內部的foreach會執行6次,每次只讀一次。

使用下面的代碼(根據您自己的代碼),查詢仍然會返回6行,正如您找到的那樣,但僅打印用戶名一次。

var queryusersandbooks = db.Query("SELECT * FROM users INNER JOIN books ON users.id = books.userid ORDER BY users.name"); 

int curruser = 0; 
foreach (var userandbook in queryusersandbooks) 
{ 
    if (userandbook.userid != curruser) 
    { 
     <span>@userandbook.name</span> 
     curruser = userandbook.userid; 
    } 
    <span>@userandbook.bookname</span> 
} 
1

您正在尋找GROUP_CONCAT。嘗試是這樣的:

SELECT name AS Name, GROUP_CONCAT(books.bookname SEPARATOR ', ') AS Books 
FROM books INNER JOIN users ON users.id=books.userid 
GROUP BY books.userid; 

記住GROUP-CONCAT有1024個字符的限制,因此,如果您需要更多空間,設置一個更大的閾值在執行SQL之前,像這樣:

SET SESSION group_concat_max_len = 1000000; 
SELECT name AS Name, GROUP_CONCAT(books.bookname SEPARATOR ', ') AS Books 
FROM books INNER JOIN users ON users.id=books.userid 
GROUP BY books.userid; 

這裏是working fiddle

相關問題