查询mysql的问题

时间:2014-12-01 22:34:28

标签: mysql

我有三张桌子

表名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

我怎么能这样做? :(

1 个答案:

答案 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