代码之家  ›  专栏  ›  技术社区  ›  K3nzie

访问多行多对多关系的SQL选择值

  •  0
  • K3nzie  · 技术社区  · 6 年前

    我正在使用一个食谱数据库的访问,一个uni的练习。

    我想查询一个多对多关系。

    我有 ricette ingredienti 表和一个名为 ricetta_ingrediente . 现在,我应该进行一个查询,检索与所使用的Ingredienti关联的每个Ricette。

    编辑: 问题的一部分被删除了,我需要用 使用的大多数成分 ,这是我必须得到的结果。

    每次尝试都会得到一个语法错误或者一个空结果——我如何才能实现这个查询?

    更多信息

    关系模式

    [ 1

    我试过实施 this suggestion ,失败了,该怎么办?

    还有我的尝试访问错误:

    [ 3]

    2 回复  |  直到 6 年前
        1
  •  1
  •   June7    6 年前

    使用查询生成器设计视图帮助生成SQL语句。结果应该是:

    SELECT ricette.nome, ingredienti.nome
    FROM ingredienti 
    RIGHT JOIN (ricette RIGHT JOIN ricetta_ingrediente 
                ON ricette.ID = ricetta_ingrediente.id_ricetta) 
    ON ingredienti.ID = ricetta_ingrediente.id_ingrediente;
    

    要检索包含最多成分和成分的配方,例如:

    SELECT TOP 1 ricette.nome, ingredienti.nome
    FROM (SELECT id_ricetta, Count([id_ingrediente]) AS CountIng
          FROM ricetta_ingrediente GROUP BY id_ricetta) AS Q1
    RIGHT JOIN (ricette RIGHT JOIN (ingredienti RIGHT JOIN ricetta_ingrediente 
                                    ON ingredienti.ID = ricetta_ingrediente.id_ingrediente) 
                ON ricette.ID = ricetta_ingrediente.id_ricetta) 
    ON Q1.id_ricetta = ricetta_ingrediente.id_ricetta
    ORDER BY Q1.CountIng DESC;
    

    这不会解决关系。所有成分数量与前1个计数匹配的配方都将返回。查询应该如何知道您只需要1和哪一个?

        2
  •  0
  •   Gordon Linoff    6 年前

    你的问题还可以。您只需要括号,因为这是MS Access。

    我还将使用表别名:

    SELECT r.nome, i.nome
    FROM (ricette as r INNER JOIN
          ricetta_ingrediente as ri
          ON r.ID = ri.id_ricetta
         ) INNER JOIN
         ingredienti as i
         ON i.ID = ri.id_ingrediente;
    

    编辑:

    对于修订后的问题:

    SELECT TOP (1) r.nome
    FROM (ricette as r INNER JOIN
          ricetta_ingrediente as ri
          ON r.ID = ri.id_ricetta
         ) INNER JOIN
         ingredienti as i
         ON i.ID = ri.id_ingrediente
    GROUP BY r.nome
    ORDER BY COUNT(*) DESC;