我的模式中有 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
运算符,从而得到每条记录的所有可能匹配项tableA
与 tableB
的每条记录。使用变量是为了根据 id
获取 tableA
的最佳匹配记录。结果按每个 tableA
记录的匹配数排序。
注意:查询假定col1
、col2
、col3
永远不会取值0
。
关于mysql - 如何根据其他表中的条目对结果进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39940479/