Mysql PHP选择多个值,MAX(LENGTH())

时间:2016-04-29 21:00:57

标签: mysql filtering

你好朋友我正在处理查询以获取注册表列表,但我需要获取重复的条目,并且仅保留更长的

示例表:

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条记录的表格中看到此查询的效果会更快?

1 个答案:

答案 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。

DEMO