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

有可能避免乘法效应吗?

  •  -1
  • ControlAltDel  · 技术社区  · 7 年前

    我有一个可以与多个程序和主题关联的表项。当我查询项目(按程序)时,我想要的是在结果集中得到一行,其中程序和主题的ID聚集在一个字段中。如果这是可能的,我不知道怎么做。有人能给我一些建议,避免在结果集中不同的行中看到程序和主题的每一个组合,从而产生行倍增效应吗?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Bill Karwin    7 年前

    听起来你好像正在经历一场灾难 Cartesian product ,因为程序和主题之间没有直接的关联。

    你可以用 GROUP_CONCAT() 如果你想要一个逗号分隔的程序或主题列表,就像你说的那样“聚集”。但每个程序和每个主题只有一个表达式。

    SELECT item.*, 
     GROUP_CONCAT(program.some_col) AS clummped_programs,
     GROUP_CONCAT(topic.some_col) AS clumped_topics
    FROM item
    LEFT JOIN program ON ...
    LEFT JOIN topic ON ...
    GROUP BY item.id
    

    SELECT item.*, program.*
    FROM item
    LEFT JOIN program ON ...
    
    SELECT item.*, topic.*
    FROM item
    LEFT JOIN topic ON ...