如何根据其他表中的条目对结果进行排序

时间:2016-10-09 05:52:13

标签: mysql sorting sql-order-by

我的架构中有2个表

表A

+----+------+------+------+
| id | col1 | col2 | col3 |
+----+------+------+------+
|  1 | abc  | NULL | abc  |
|  2 | abc  | NULL | NULL |
|  3 | NULL | abc  | abc  |
+----+------+------+------+

表B

+------+------+------+
| col1 | col2 | col3 |
+------+------+------+
| NULL | abc  | abc  |
| abc  | NULL | abc  |
| abc  | abc  | abc  |
+------+------+------+

我想选择表A中的所有记录,如果它在表2中有相同的条目,则对它们进行排序。

在这种情况下,我的回答是

+----+------+------+------+
| id | col1 | col2 | col3 |
+----+------+------+------+
|  1 | abc  | NULL | abc  |
|  3 | NULL | abc  | abc  |
|  2 | abc  | NULL | NULL |
+----+------+------+------+

任何帮助或想法都将不胜感激

1 个答案:

答案 0 :(得分:1)

这样的事情应该有效:

SELECT id, col1, col2, col3
FROM (
   SELECT id, col1, col2, col3, matches,
          @seq := IF(@id = id, @seq + 1,
                     IF(@id := id, 1, 1)) AS seq
   FROM (
      SELECT t1.id, t1.col1, t1.col2, t1.col3,
             IF(t2.col1 IS NULL, 0, 1) + IF(t2.col2 IS NULL, 0, 1) + 
             IF(t2.col3 IS NULL, 0, 1) AS matches
      FROM tableA AS t1
      LEFT JOIN tableB AS t2 
         ON COALESCE(t1.col1,0) = COALESCE(t2.col1,0) OR 
            COALESCE(t1.col2,0) = COALESCE(t2.col2,0) OR 
            COALESCE(t1.col3,0) = COALESCE(t2.col3,0) ) AS t
   CROSS JOIN (SELECT @seq := 0, @id :=0) AS vars         
   ORDER BY id, matches DESC  ) AS x
WHERE x.seq = 1 
ORDER BY x.matches DESC, x.id

该查询在LEFT JOIN子句中使用OR运算符与ON运算符,以便获得tableA的每条记录与tableB的每条记录的所有可能匹配项{1}}。使用变量是为了获得tableAid的最佳匹配记录。结果按每个tableA记录的匹配数排序。

Demo here

注意:该查询假设col1col2col3从未取值0