繁体   English   中英

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

[英]Mysql PHP Select with multiple values, MAX(LENGTH())

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

示例表:

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条记录的表格中的表现会更快吗?

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 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM