【问题标题】:Mysql PHP Select with multiple values, MAX(LENGTH())Mysql PHP Select 有多个值,MAX(LENGTH())
【发布时间】:2016-08-25 03:32:29
【问题描述】:

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

示例表:

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 条记录的表中的性能会更快?

【问题讨论】:

  • 你得到了什么结果/查询?
  • 一直获取 UserId 短注册表 .... all 002
  • 我已经更新了这篇文章

标签: mysql filtering


【解决方案1】:
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

【讨论】:

  • 如果您当然是对的,那么问题出在“Where IN”以及重复项和长度字符的过滤器上。因为它继续显示,因为结果仍然向我显示较少的字符串而不是较大的
  • 更新了答案以显示如何获取最长的用户 ID。
  • 我收到此错误:“on 子句”中的未知列“t2.IDref”
  • 我无法重现该错误,但我确实有一些其他问题已修复。查看新代码。
  • 这项工作但还可以,但是您是否看到此查询在具有 20,000 条记录的表中的性能会更快?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-20
  • 2012-11-20
相关资源
最近更新 更多