gpt4 book ai didi

SQL - 选择具有多个类别的不同行

转载 作者:行者123 更新时间:2023-12-04 06:02:15 25 4
gpt4 key购买 nike

我有三个数据库表:

故事

  • 身份证
  • 标题
  • 内容

  • 类别
  • 身份证
  • 标题

  • 故事分类
  • 故事编号
  • 类别 ID

  • 注意:Story 和 Category 是多对多的关系(一个故事可以有多个类别,一个类别可以有多个故事)所以我创建了 StoryCategory。此外,故事可以没有类别。

    我还有一个网页(我正在使用 Razor ):
    <form action="" method="get">
    <label for="keyword">Keyword:</label>
    <input name="keyword" type="text" value="@Page.Keyword" />
    <label for="category">Category:</label>
    <select name="category">
    <option value="">All</option>
    @foreach(var category in Page.Categories)
    {
    <option value=@category.Id @(category.Id == Page.Category? "selected=selected" : "")>@category.Title</option>
    }
    </select>
    <input type="submit" value="Search" />
    </form>

    为简单起见,此页面允许用户输入关键字来搜索特定故事,还允许用户选择故事所属的类别。

    我找不到找到附加到特定类别的故事的方法。这是我的第一个代码(忽略关键字以关注类别):
    select s.title --columns will be added here such as name of category/ies, author etc.
    from story as s
    left join --left join so the uncategorized stories will not be excluded
    storyCategory as sc
    on s.id = sc.storyId
    where sc.categoryId = @selectedCategory --this line is removed when there is no category selected

    样本数据:
  • 故事

    id 标题内容
    1个火影...
    2 漂白剂 ...
  • 类别

    身份证号
    1 幻想
    2 Action
    3剧
  • 故事分类

    故事 ID 类别 ID
    1 1
    1 2
    2 1

  • 问题是,如果没有选择的类别,如果故事有多个类别,它也会出现多次:
    naruto (fantasy)
    naruto (action)
    bleach (fantasy)

    我实际上知道发生了什么,但我想不出解决问题的最佳解决方案。

    最佳答案

    使用 DISTINCT 关键字和 left join 对你的 WHERE 条件没用

    select DISTINCT
    s.title --columns will be added here such as name of category/ies, author etc.
    from story as s
    join storyCategory as sc--left join so the uncategorized stories will not be excluded
    on s.id = sc.storyId
    where sc.categoryId = @selectedCategory --this line is removed when there is no category selected

    如果您需要附加到每个故事的类别列表 - 请参阅并检查下一个查询。对 sql server 有效:
    DECLARE @Stories TABLE(Id INT IDENTITY PRIMARY KEY, NAME NVARCHAR(100) NOT NULL) 
    DECLARE @Categories TABLE(Id INT IDENTITY PRIMARY KEY, NAME NVARCHAR(100) NOT NULL)
    DECLARE @Fork TABLE(StoryId INT NOT NULL, CategoryId INT NOT NULL, PRIMARY KEY(StoryId, CategoryId))

    INSERT @Stories
    VALUES ('Story1'), ('Story2'), ('Story3')

    INSERT @Categories
    VALUES ('Category1'), ('Category2'), ('Category3')

    INSERT @Fork
    VALUES(1,1), (1,2), (3,3), (2,3)

    DECLARE @selectedCategory INT = 3

    select
    s.NAME,
    (
    SELECT c.Name + ','
    FROM @Categories c
    JOIN @Fork f ON f.CategoryId = c.Id AND f.StoryId = s.Id
    ORDER BY c.Name
    FOR XML PATH('')
    ) Categories
    from @stories s

    关于SQL - 选择具有多个类别的不同行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8814775/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com