你好朋友我正在处理查询以获取注册表列表,但我需要获取重复的条目,并且仅保留更长的
示例表:
ID = INT Auto increment
IDref = INT not null
UserId = INT ZeroFill
+--------+---------+--------+---------+
| ID | IDref | UserId | |
+--------+---------+--------+---------+
| 1 | 1 | 00001 | |
| 3 | 1 | 001 | |
| 4 | 1 | 002 | |
| 5 | 2 | 00001 | |
| 6 | 2 | 001 | |
| 7 | 2 | 002 | |
| 8 | 3 | 00001 | |
| 9 | 4 | 002 | |
+--------+---------+--------+---------+
查询
SELECT ID, IDref, UserId
FROM Table
WHERE UserId = '00001' OR '002'
GROUP BY IDref
HAVING count(IDref) > 0
ORDER BY CHAR_LENGTH(UserId ) DESC
LIMIT 1
更新 我正在接受
+--------+---------+--------+---------+
| ID | IDref | UserId | |
+--------+---------+--------+---------+
| 4 | 1 | 002 | |
+--------+---------+--------+---------+
我需要这个输出:
+--------+---------+--------+---------+
| ID | IDref | UserId | |
+--------+---------+--------+---------+
| 1 | 1 | 00001 | |
| 5 | 2 | 00001 | |
| 8 | 3 | 00001 | |
| 9 | 4 | 002 | |//count(IDref) > 0// one registry find.
+--------+---------+--------+---------+
但不能正常运行我的查询。有人可以帮助我。
使用工作代码的最后更新感谢Barmar:
SELECT t1.ID, t1.IDref, t1.UserId
FROM Table1 AS t1
JOIN (SELECT IDref, MAX(LENGTH(UserId)) AS maxlength
FROM Table1
WHERE UserID IN ('00001', '002')
GROUP BY IDref) AS t2
ON t1.IDref = t2.IDref AND LENGTH(t1.UserId) = t2.maxlength
WHERE t1.UserId IN ('00001', '002')
好的,但您是否可以在包含20,000条记录的表格中看到此查询的效果会更快?
答案 0 :(得分:0)
WHERE UserId = '00001' OR '002'
不是测试列是否与这些值匹配的正确方法。正确的方法是
WHERE UserId IN ('00001', '002')
您的代码等同于
WHERE (UserId = '00001') OR '002'
始终为真,因为'002'
不是假的。
您还应该删除LIMIT 1
。否则,您只会获得具有重复项的IDRef
之一。
ORDER BY LENGTH(UserId)
不会使分组值选择长度最长的行 - 在分组后完成排序,并且分组只是任意选择其中一个值。为此,您需要使用SQL Select only rows with Max Value on a Column
SELECT t1.ID, t1.IDref, t1.UserId
FROM Table1 AS t1
JOIN (SELECT IDref, MAX(LENGTH(UserId)) AS maxlength
FROM Table1
WHERE UserID IN ('00001', '002')
GROUP BY IDref) AS t2
ON t1.IDref = t2.IDref AND LENGTH(t1.UserId) = t2.maxlength
WHERE t1.UserId IN ('00001', '002')
不需要HAVING COUNT(IDRef) > 0
,因为count总是大于0。