如何编写一列返回多个结果 C# 的 SQL 查询

本文关键字:结果 查询 SQL 返回 何编写 一列 | 更新日期: 2023-09-27 18:36:12

我有两个表:

用户:

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 查询的情况下做到这一点?

谢谢

如何编写一列返回多个结果 C# 的 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;

这是一个工作小提琴。

试试这样的事情

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

如果我要在 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以了解更多详细信息。如果可能有很多书,或者如果您希望每本书都是自己的专栏或类似的东西,这会很快崩溃,但在简单的情况下没问题。

你走在正确的轨道上。在你的原始代码中,内部 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>
}