MySQL - 同时对相同类型的字段进行排序

时间:2013-02-04 16:18:53

标签: mysql sql-order-by

这是我的问题。

我有一个包含图书数据库的网站,可以使用预定义的关键字进行搜索。在数据库中,对于每本书,我们可以向书中添加最多20个不同的关键词(如“管理”,“领导”等),每个关键词的相关值(从1到5)。此时,在选择特定关键字时,我可以对将该关键字存储为主题的所有书籍进行排序。

在数据库中,每个关键字有1个字段,每个值有1个字段,因此20个关键字有40个字段。

我的问题是,根据关键字添加到书中的顺序(从第一个到第20个),书籍按照奇怪的方式排序,相关性值仅在字段中按字段考虑(第一个关键字带有第一个,等)。

我想要的是能够像这样对它们进行排序:首先,关键字值为5,然后是4等等的书籍,无论是为书籍添加的第一个还是最后一个关键词。实际上,它的确意味着“相关性”。

我尝试使用“ORDER BY CONCAT”,但它没有改变任何东西。

以下是使用特定关键字进行查询的示例:

SELECT *,
        IF(id_theme_1=13,id_theme_deg_1,0) AS isInDeg_1,
        IF(id_theme_2=13,id_theme_deg_2,0) AS isInDeg_2,
        IF(id_theme_3=13,id_theme_deg_3,0) AS isInDeg_3,
        IF(id_theme_4=13,id_theme_deg_4,0) AS isInDeg_4,
        IF(id_theme_5=13,id_theme_deg_5,0) AS isInDeg_5,
        IF(id_theme_6=13,id_theme_deg_6,0) AS isInDeg_6,
        IF(id_theme_7=13,id_theme_deg_7,0) AS isInDeg_7,
        IF(id_theme_8=13,id_theme_deg_8,0) AS isInDeg_8,
        IF(id_theme_9=13,id_theme_deg_9,0) AS isInDeg_9,
        IF(id_theme_10=13,id_theme_deg_10,0) AS isInDeg_10,
        IF(id_theme_11=13,id_theme_deg_11,0) AS isInDeg_11,
        IF(id_theme_12=13,id_theme_deg_12,0) AS isInDeg_12,
        IF(id_theme_13=13,id_theme_deg_13,0) AS isInDeg_13,
        IF(id_theme_14=13,id_theme_deg_14,0) AS isInDeg_14,
        IF(id_theme_15=13,id_theme_deg_15,0) AS isInDeg_15,
        IF(id_theme_16=13,id_theme_deg_16,0) AS isInDeg_16,
        IF(id_theme_17=13,id_theme_deg_17,0) AS isInDeg_17,
        IF(id_theme_18=13,id_theme_deg_18,0) AS isInDeg_18,
        IF(id_theme_19=13,id_theme_deg_19,0) AS isInDeg_19,
        IF(id_theme_20=13,id_theme_deg_20,0) AS isInDeg_20
FROM mng_ouvrages
WHERE lang='fr' AND publish=1
ORDER BY CONCAT(isInDeg_4,isInDeg_2,isInDeg_3,isInDeg_1,isInDeg_5,isInDeg_6,isInDeg_7,isInDeg_8,isInDeg_9,isInDeg_10,
                isInDeg_11,isInDeg_12,isInDeg_13,isInDeg_14,isInDeg_15,isInDeg_16,isInDeg_17,isInDeg_18,isInDeg_19,isInDeg_20) DESC

有了这个,我首先会在第一个字段(相关性为5)中存储关键字的书籍之前,将关键字存储在第四个字段(相关性为3)中。

有没有人知道是否有办法进行这种排序?

非常感谢你的帮助。

1 个答案:

答案 0 :(得分:0)

您可以使用MySQL的GREATEST()函数获取所有关键字的最大相关性值:

ORDER BY GREATEST(COALESCE(keyword_1_value,0), COALESCE(keyword_2_value,0),
    COALESCE(keyword_3_value,0, ..., COALESCE(keyword_20_value,0)) DESC