【问题标题】:want to fetch first 9 records and make one more record which will be as “Others” in mysql想要获取前 9 条记录并再制作一条记录,这将在 mysql 中作为“其他”
【发布时间】:2011-02-06 12:31:35
【问题描述】:

我正在从一个表中获取记录,其中一个字段的计数以其他字段为名称。我只想要 10 条记录。其中 9 条记录给了我字段及其计数。但我想将 10 条记录显示为“其他”,所有剩余字段都带有计数。这类似于包装记录。

类似下面的内容将是表格内容。

emp_id |指定

1 |软件工程。

2 |软件工程。

3 |项目经理

不少于10个指定。

我想将前 10 条记录显示为

Software Engineers  20
Project Manager     5
....
....
....
Others    50

有没有办法为 mysql db 进行 SQL 查询。这样它会在我为“其他”添加记录计数的应用程序级别快速并节省时间。或者建议我如何以有效的方式实现它。

【问题讨论】:

  • 你能做一个标准的SELECT .. GROUP BY,然后是一个UNION SELECT ... WHERE NOT EXISTS吗?

标签: php sql mysql zend-framework stored-procedures


【解决方案1】:

试试这个:

SELECT IF(rowNum <= 9, designation, 'Other') designation, SUM(cnt)
FROM (SELECT designation, COUNT(*) cnt, (@row := @row + 1) rowNum
    FROM contents, (SELECT @row := 0) dm
    GROUP BY designation
    ORDER BY designation
) d
GROUP BY IF(rowNum <= 9, designation, 'Other')

更改 GROUP BYORDER BY,但您可以决定显示什么 9。

【讨论】:

  • .. 我收到错误消息,因为“每个派生表都必须有自己的别名”
  • @kamlesh-bhure 已更新.. 对此感到抱歉
  • ...是的,它有效..你能分享一下上述查询背后的逻辑吗?这个查询能在 10000 条记录上快速运行吗?
  • 这是完美的答案。我正在为此创建存储过程,这将很快工作。
【解决方案2】:

您可以在查询中使用SQL_CALC_FOUND_ROWS 选项,这将告诉 MySQL 计算总行数而忽略 LIMIT 子句。您仍然需要执行第二个查询来检索行数,但这是一个简单的查询,不如检索数据的查询那么复杂。

使用非常简单。在主查询中,您需要在 SELECT 之后添加 SQL_CALC_FOUND_ROWS 选项,在第二个查询中,您需要使用 FOUND_ROWS() 函数来获取总行数。查询如下所示:

SELECT SQL_CALC_FOUND_ROWS name, email FROM users WHERE name LIKE 'a%' LIMIT 10;

SELECT FOUND_ROWS();

【讨论】:

  • 谢谢......它有效......我可以通过提供 LIMIT 9 来获取员工数量,没有找到的行。
  • 这并不能完全解决我的问题。因为我正在编写查询选择名称,count(distinct emp_id) from emp_design Limit 9, $num_rows;但它给了我零记录。
猜你喜欢
  • 2019-06-13
  • 2017-02-24
  • 1970-01-01
  • 2021-01-22
  • 1970-01-01
  • 2019-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多