我的架构中有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 |
+----+------+------+------+
任何帮助或想法都将不胜感激
答案 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}}。使用变量是为了获得tableA
每id
的最佳匹配记录。结果按每个tableA
记录的匹配数排序。
注意:该查询假设col1
,col2
,col3
从未取值0
。