Mysql 如何根据其他表中的条目对结果进行排序
我的模式中有两个表 表AMysql 如何根据其他表中的条目对结果进行排序,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
+----+------+------+------+
| 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