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

Mysql 如何根据其他表中的条目对结果进行排序,mysql,sorting,sql-order-by,Mysql,Sorting,Sql Order By,我的模式中有两个表 表A +----+------+------+------+ | id | col1 | col2 | col3 | +----+------+------+------+ | 1 | abc | NULL | abc | | 2 | abc | NULL | NULL | | 3 | NULL | abc | abc | +----+------+------+------+ 表B +------+------+------+ | col1 | col2

我的模式中有两个表

表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
子句中使用带有
运算符的
左连接
操作,以便获得
表a
的每条记录与
表b
的每条记录的所有可能匹配项。变量用于根据
id
获得
tableA
的最佳匹配记录。结果按每个
表a
记录的匹配数排序


注意:查询假设
col1
col2
col3
从不接受值
0
,如果表B有多条记录会发生什么?与表2匹配的任何行都必须位于结果答案的顶部。这并不能真正回答我的问题,所以我想我会再问一次。如果表B有多条记录会发生什么?用您的案例修改了我的示例。请看一看,这是一个糟糕的表/数据库设计。您需要交叉连接表,即使这样也会留下其他问题。我是否可以将表a中每一行与表b匹配的行数作为答案中的新列?因此,与表b不匹配的行的计数将为0?@SamuelRobert是的,我的查询为此使用
matches
字段。只需将其添加到
SELECT
子句中即可。尽管有一个小小的更改,但内部查询逻辑运算符中的左连接应该是AND,而不是OR