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

标签 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 |
+----+------+------+------+

任何帮助或意见将不胜感激

最佳答案

像这样的东西应该可以工作:

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

查询在ON子句中使用LEFT JOIN操作和OR运算符,从而得到每条记录的所有可能匹配项tableAtableB 的每条记录。使用变量是为了根据 id 获取 tableA 的最佳匹配记录。结果按每个 tableA 记录的匹配数排序。

Demo here

注意:查询假定col1col2col3 永远不会取值0

关于mysql - 如何根据其他表中的条目对结果进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39940479/

相关文章:

php - 如何使用 AJAX/jQuery 显示打印?

php - 关于 mysqli 准备好的语句的问题

Android如何按列对 ListView 中的对象列表进行排序

c - 通过数组实现使用 Downheap 算法时遇到问题

c# - 字典的 OrderBy 方法的大 O 是什么

mysql - Order by Points 但如果与 MySQL 中的 order by 相同

mysql - 在表的第一列中获取 1 个结果,在表的第二列中获取所有结果

sql - mySQL 如何处理 ORDER BY 中的动态值

mysql - 为什么内部 ORDER BY 不起作用?

mysql - 保留行,即使它们在其他连接表 MySQL 查询中没有任何行