2016-02-25 95 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

相关问题