0

学生用のテーブルを含むデータベースがあります。構造はこんな感じ

id      name
---     -----
1       Tini
2       Eka

それから本のテーブル

id      title
---     ------
1       Cinderella's story
2       Pinochio
3       Mickey Mouse

それから借りるために

id      students_id     books_id
---     ------------    ---------
1       1               1,3
2       2               2,3

「ティニがシンデレラのお話とミッキーマウスをお借りしています」ってどうやったら出てくるの?私はすでにこのようなクエリを試しました

select students.*, books.* , borrowing.*
    (select books.title from borrowing
     join books on books.id = borrowing.books_id
     where books_.id = borrowing.books_id limit 1)  as books_title
from borrowing
join students on students.id = borrowing.students_id
join books on books.id = borrowing.books_id 
GROUP BY books.title

しかし、それは私にエラーをスローします

4

4 に答える 4

0

クエリを修正する代わりに、リレーション テーブルのデータを正規化することをお勧めしますborrowing

次のようなデータの保存方法に変更します。

id      students_id     books_id
---     ------------    ---------
1       1               1
2       1               3
3       2               2
4       2               3

また、id列も必要ないため、省略できます。

次に、各学生の借用リストを取得するのは非常に簡単です。

SELECT t1.name, GROUP_CONCAT(t3.title) AS borrowed_books
FROM students t1
LEFT JOIN borrowing t2 ON t2.students_id = t1.id
LEFT JOIN books t3 ON t3.id = t2.books_id
GROUP BY t1.name
于 2014-03-27T04:45:47.330 に答える
0
id      students_id     books_id
---     ------------    ---------
1       1               1
2       1               3
3       2               2
3       3               3

select s.name, bk.title
from student s
inner join borrowing b
on s.id = b.students_id
inner join book bk
on b.book_id = bk.id
where s.id = 1
于 2014-03-27T04:45:55.267 に答える
0

この関数を使用して、データベースにこの関数を作成します。

ALTER FUNCTION [dbo].[funcSplit]
(
    @param      NVARCHAR(MAX),
    @delimiter  CHAR(1)
)
RETURNS @t TABLE (val NVARCHAR(MAX))
--select * from dbo.funcSplit('1,3',',')
AS
BEGIN
    SET @param += @delimiter

    ;WITH a AS
    (
        SELECT CAST(1 AS BIGINT) f,
               CHARINDEX(@delimiter, @param) t,
               1 seq
        UNION ALL
        SELECT t + 1,
               CHARINDEX(@delimiter, @param, t + 1),
               seq + 1
        FROM   a
        WHERE  CHARINDEX(@delimiter, @param, t + 1) > 0
    )
    INSERT @t
    SELECT SUBSTRING(@param, f, t - f)         
    FROM   a
           OPTION(MAXRECURSION 0)

    RETURN
END

そして、このコードを実行すると、

select s.sname,bk.bname,f.val from stud as s
left join  borrowing as b on s.sid = b.students_id
cross apply dbo.funcSplit(b.bookid,',') as f
left join books as bk on bk.bookid = f.val
where sid = 1
于 2014-03-27T04:46:06.283 に答える
0

実際には、クエリで group_concat() を使用する必要があります

次のクエリを使用するには、上記の回答で述べた @sotondolphin のようなテーブルが必要です。

これを試して

select user_id,group_concat(book_id) from userTable
inner join book_borrow_tbl on  userTable.user_id=book_borrow_tbl.user_id
group by user_id
于 2014-03-27T04:48:10.267 に答える