显示多对多和多对最重要的一个

w9apscun  于 2021-08-13  发布在  Java
关注(0)|答案(1)|浏览(223)

这可能有答案,但我甚至不知道如何寻找它。
我有一个多对多的关系,我想用“最重要的”一个来显示它。例如,这个查询

SELECT Country.CountryName, FlagColor.Color
FROM Country
JOIN FlagColor USING (CountryID)
WHERE ...;

会回来的

CountryName  |  Color

  Ireland    |  Green
  Ireland    |  Orange
  Ireland    |  White
   Italy     |  Green
   Italy     |   Red
   Italy     |  White
    USA      |  Blue
    USA      |   Red
    USA      |  White

我知道 GROUP BY 可以将这些限制为每种颜色,但可以是其中的任何一种。我决定用蓝色,然后是红色,然后是绿色。所以我想修改上面的查询以返回

CountryName  |  Color

  Ireland    |  Green
   Italy     |   Red
    USA      |  Blue

我该怎么做?如果相关的话,我使用的是mysql 5.7。

o4hqfura

o4hqfura1#

你可以用 FIELD 根据你的优先顺序对颜色进行排序,首先根据最不喜欢的颜色进行排序(从 FIELD 对于不在列表中的值返回0,这将确保这些值排在最后)。然后你就可以得到 MAX 每个国家和地区的价值 JOIN 那是给 Country 以及 FlagColor 获得每个国家所需颜色的表格:

SELECT c.CountryName, f.Color
FROM Country c
JOIN FlagColor f ON f.CountryId = c.CountryId
JOIN (
  SELECT CountryId, MAX(FIELD(Color, 'Green', 'Red', 'Blue')) ColorId
  FROM FlagColor 
  GROUP BY CountryId
) m ON m.CountryId = c.CountryId
   AND m.ColorId = FIELD(f.Color, 'Green', 'Red', 'Blue')

输出:

CountryName     Color
Ireland         Green
Italy           Red
USA             Blue

在dbfiddle上演示

相关问题