将多对多显示为多对最重要的
Displaying many-to-many as many-to-most-important-one
这可能在某个地方有答案,但我什至不确定如何搜索它。
我有一个多对多的关系,我想将它显示为与“最重要”的一对一。例如,这个查询
SELECT Country.CountryName, FlagColor.Color
FROM Country
JOIN FlagColor USING (CountryID)
WHERE ...;
会return
CountryName | Color
Ireland | Green
Ireland | Orange
Ireland | White
Italy | Green
Italy | Red
Italy | White
USA | Blue
USA | Red
USA | White
我知道 GROUP BY
可以将它们限制为一种颜色,但可以是其中任何一种。我决定蓝色是顶级颜色,其次是红色,然后是绿色。所以我想将上面的查询修改为return
CountryName | Color
Ireland | Green
Italy | Red
USA | Blue
我该怎么做?如果相关,我正在使用 MySQL 5.7.
您可以使用 FIELD
根据您的优先顺序对颜色应用排序,根据最不喜欢的优先顺序对它们进行排序(因为 FIELD
returns 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
这可能在某个地方有答案,但我什至不确定如何搜索它。
我有一个多对多的关系,我想将它显示为与“最重要”的一对一。例如,这个查询
SELECT Country.CountryName, FlagColor.Color
FROM Country
JOIN FlagColor USING (CountryID)
WHERE ...;
会return
CountryName | Color
Ireland | Green
Ireland | Orange
Ireland | White
Italy | Green
Italy | Red
Italy | White
USA | Blue
USA | Red
USA | White
我知道 GROUP BY
可以将它们限制为一种颜色,但可以是其中任何一种。我决定蓝色是顶级颜色,其次是红色,然后是绿色。所以我想将上面的查询修改为return
CountryName | Color
Ireland | Green
Italy | Red
USA | Blue
我该怎么做?如果相关,我正在使用 MySQL 5.7.
您可以使用 FIELD
根据您的优先顺序对颜色应用排序,根据最不喜欢的优先顺序对它们进行排序(因为 FIELD
returns 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