我有三张桌子
表名1:主席 字段表1:id(INT) - model(VARCHAR)//主索引:id
表名2:颜色 字段表2:id(INT) - color(VARCHAR)//主索引:id
表名3:chair2color 字段表3:id_chair(INT) - id_color(INT)//主索引:id_chair-id_color
每把椅子都有不同的颜色:红色或绿色或(红色和绿色)。
表1(主席)的一些值:
1 - modelA
2 - modelB
3 - modelC
表2的某些值(颜色):
1 - red
2 - green
表3(chair2color)的一些值:
1 - 1
2 - 2
3 - 1
3 - 2
我希望以这种方式让所有椅子模型按颜色排序:
SELECT chair.id AS ID_CHAIR
FROM chair
LEFT JOIN chair2color ON chair.id=chair2color.id_chair
ORDER BY FIELD (chair2color.id_color,'1','2')
我得到的结果是:
ID_CHAIR
1
2
3
我的问题是,只有红色的椅子出现在第一位(没关系)。然后,我有椅子,只有绿色,然后椅子是绿色和红色。
我希望绿色和红色椅子出现在绿色椅子之前,因为它们也是红色的。
我想要的结果(我认为正确的结果)是:
ID_CHAIR
1
3
2
我怎么能这样做? :(
答案 0 :(得分:0)
您希望无论如何都要拥有不同的主席ID,因此您可以使用group_concat()
构建一串颜色并按此顺序排序。
SELECT id_chair, group_concat(id_color order by id_color) colors
FROM chair
LEFT JOIN chair2color ON chair.id=chair2color.id_chair
GROUP BY id_chair
ORDER BY colors
如果您想要特定订单,可以使用FIELD()
功能实现此目的。阅读更多相关信息here。
SELECT id_chair, group_concat(id_color order by id_color) AS colors
FROM chair
LEFT JOIN chair2color ON chair.id=chair2color.id_chair
GROUP BY id_chair
ORDER BY FIELD(group_concat(id_color order by id_color), 4,3,5,1,2)
group_concat(id_color order by id_color)
中的order by
将隐式转换为整数。因此它有效(见实时here)。
如果你想颠倒顺序,意思是排序降序,你也必须颠倒field()
函数中的顺序。
SELECT id_chair, group_concat(id_color order by id_color) AS colors
FROM chair
LEFT JOIN chair2color ON chair.id=chair2color.id_chair
GROUP BY id_chair
ORDER BY FIELD(group_concat(id_color order by id_color), 2,1,5,3,4) DESC