我有两个表:
用户:
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
UserId 是显示每个用户拥有哪些书籍的键
在我的 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 查询的情况下执行此操作?
谢谢
最佳答案
您正在寻找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 .
关于c# - 如何编写一列返回多个结果的SQL查询C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35638996/